sql >> データベース >  >> RDS >> Oracle

カンマ区切り値を格納する列値の値を検索します

    Oracleセットアップ

    CREATE OR REPLACE FUNCTION split_String(
      i_str    IN  VARCHAR2,
      i_delim  IN  VARCHAR2 DEFAULT ','
    ) RETURN SYS.ODCIVARCHAR2LIST DETERMINISTIC
    AS
      p_result       SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
      p_start        NUMBER(5) := 1;
      p_end          NUMBER(5);
      c_len CONSTANT NUMBER(5) := LENGTH( i_str );
      c_ld  CONSTANT NUMBER(5) := LENGTH( i_delim );
    BEGIN
      IF c_len > 0 THEN
        p_end := INSTR( i_str, i_delim, p_start );
        WHILE p_end > 0 LOOP
          p_result.EXTEND;
          p_result( p_result.COUNT ) := SUBSTR( i_str, p_start, p_end - p_start );
          p_start := p_end + c_ld;
          p_end := INSTR( i_str, i_delim, p_start );
        END LOOP;
        IF p_start <= c_len + 1 THEN
          p_result.EXTEND;
          p_result( p_result.COUNT ) := SUBSTR( i_str, p_start, c_len - p_start + 1 );
        END IF;
      END IF;
      RETURN p_result;
    END;
    /
    
    CREATE TABLE xyz ( weekend_days ) AS
    SELECT 'SATURDAY,SUNDAY' FROM DUAL;
    
    CREATE TABLE abc ( act_date ) AS
    SELECT DATE '2016-02-02' FROM DUAL UNION ALL
    SELECT DATE '2016-02-06' FROM DUAL;
    

    クエリ

    SELECT act_date,
           CASE WHEN w.Weekend_day IS NULL THEN 0 ELSE 1 END AS weekend_flag
    FROM  abc a
          LEFT OUTER JOIN
          ( SELECT t.column_value AS weekend_day
            FROM   xyz x,
                   TABLE( split_String( x.weekend_days ) ) t
          ) w
          ON TRIM( TO_CHAR( a.ACT_DATE, 'DAY' ) ) = w.Weekend_day;
    

    出力

    ACT_DATE  WEEKEND_FLAG
    --------- ------------
    06-FEB-16            1 
    02-FEB-16            0 
    

    代替クエリ

    SELECT act_date,
           CASE
             WHEN INSTR( x.weekend_days, TRIM( TO_CHAR( act_date, 'DAY' ) ) ) > 0
             THEN 1
             ELSE 0
             END AS weekend_flag
    FROM   abc a
           CROSS JOIN
           xyz x;
    

    これにより、同じ出力が得られ、曜日の名前では機能しますが、サブ文字列に誤検出が一致する可能性があるため、一般的なケースでは機能しません。



    1. SQL30日より古いすべてのレコードを取得します

    2. Spotlight Cloud Monitoringに関連するセキュリティリスクはありますか?

    3. Oracleのデュアルテーブルとは何ですか?

    4. OracleのNLS_NCHAR_CHARACTERSETとNLS_CHARACTERSETの違い