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

列の値を繰り返す

    Oracleセットアップ

    CREATE TABLE your_table ( your_list_column ) AS
      SELECT 'a,a,b,c,d' FROM DUAL UNION ALL -- duplicates both at head
      SELECT 'a,b,a,c,d' FROM DUAL UNION ALL -- duplicates at head and middle
      SELECT 'a,b,c,d,a' FROM DUAL UNION ALL -- duplicates at head and tail
      SELECT 'a,b,b,c,d' FROM DUAL UNION ALL -- duplicates at middle and next item
      SELECT 'a,b,c,b,d' FROM DUAL UNION ALL -- duplicates at middle and middle
      SELECT 'a,b,c,d,b' FROM DUAL UNION ALL -- duplicates at middle and tail
      SELECT 'a,b,c,d,d' FROM DUAL UNION ALL -- duplicates both at tail
      SELECT 'a,b,a,c,b' FROM DUAL UNION ALL -- two pairs of duplicates
      SELECT 'a,b,c,d,e' FROM DUAL;          -- no duplicates
    

    繰り返し値を持つリストを取得するには、正規表現で後方参照を使用できます。

    SELECT *
    FROM   your_table
    WHERE  REGEXP_LIKE( ',' || your_list_column || ',', ',([^,]+),(.+,)?\1,' )
    

    出力

    YOUR_LIST_COLUMN
    ----------------
    a,a,b,c,d
    a,b,a,c,d
    a,b,c,d,a
    a,b,b,c,d
    a,b,c,b,d
    a,b,c,d,b
    a,b,c,d,d
    a,b,a,c,b
    

    最初の繰り返し値を取得するには、上記の正規表現の最初のサブグループを抽出できます。

    SELECT your_list_column,
           REGEXP_SUBSTR( ',' || your_list_column || ',', ',([^,]+),(.+,)?\1,', 1, 1, NULL, 1 )
             AS duplicate_value
    FROM   your_table
    WHERE  REGEXP_LIKE( ',' || your_list_column || ',', ',([^,]+),(.+,)?\1,' )
    

    出力

    YOUR_LIST_COLUMN DUPLICATE VALUE
    ---------------- ---------------
    a,a,b,c,d        a
    a,b,a,c,d        a
    a,b,c,d,a        a
    a,b,b,c,d        b
    a,b,c,b,d        b
    a,b,c,d,b        b
    a,b,c,d,d        d
    a,b,a,c,b        a
    

    一意の値を取得するには、split_string()を使用します ここで定義されているように機能します(ただし、事前定義されたVARRAYではなくユーザー定義型を使用します ):

    CREATE OR REPLACE TYPE stringlist IS TABLE OF VARCHAR2(4000);
    /
    
    CREATE OR REPLACE FUNCTION split_String(
      i_str    IN  VARCHAR2,
      i_delim  IN  VARCHAR2 DEFAULT ','
    ) RETURN stringlist DETERMINISTIC
    AS
      p_result       stringlist := stringlist();
      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;
    /
    

    次に、SET()と組み合わせて使用​​できます。 収集機能:

    SELECT t.*,
           (
             SELECT LISTAGG( COLUMN_VALUE, ',' ) WITHIN GROUP ( ORDER BY ROWNUM )
             FROM   TABLE( SET( split_string( t.your_list_column ) ) )
           ) AS unique_list
    FROM   your_table t
    

    出力

    YOUR_LIST_COLUMN UNIQUE_LIST
    ---------------- ---------------
    a,a,b,c,d        a,b,c,d
    a,b,a,c,d        a,b,c,d
    a,b,c,d,a        a,b,c,d
    a,b,b,c,d        a,b,c,d
    a,b,c,b,d        a,b,c,d
    a,b,c,d,b        a,b,c,d
    a,b,c,d,d        a,b,c,d
    a,b,a,c,b        a,b,c
    a,b,c,d,e        a,b,c,d,e
    


    1. Oracleデータベースに送信されるすべてのクエリを表示する

    2. 開発プロジェクト中のミッションクリティカルなアクセスアプリケーションの特定と管理

    3. SQLite JSON_SET()

    4. 更新ステートメントの冗長データ