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

副選択からの結合結果

    以下のように f を関数として定義できます

    create or replace function f(param IN VARCHAR2) return varchar2 is
      Result varchar2(32767);
    begin
      with names as(
        SELECT REGEXP_SUBSTR(regexp_replace(replace(param,
                                                    chr(13) || chr(10),
                                                    ','),
                                            '[[:space:]]*',
                                            ''),
                             '[^=]+',
                             1,
                             level) as name
          FROM DUAL
        CONNECT BY LEVEL <= (SELECT REGEXP_COUNT(param, '=') FROM DUAL)
    
         )
    
          select LISTAGG(nvl(regexp_substr(name, '[^,]+', 1, 2),
                             regexp_substr(name, '[^,]+', 1)),
                         ',') WITHIN
           GROUP(
           ORDER BY name)
            INTO Result
            from names;
    
      return(Result);
    end f;
    

    次に、以下のようにパラメーターを呼び出すことができます

    with parameter(param) as (
        select 'aa = black' ||chr(13)||chr(10)||'bb = change'||chr(13)||chr(10)||'mmmm=no'  
        from dual union  all
       select 'aa = black' ||chr(13)||chr(10)||'bb = change'||chr(13)||chr(10)||'kkk=no' from dual
        )
        select distinct regexp_substr(f(param),'[^,]+',1,level) from parameter
        connect by level <=regexp_count(f(param),',')+1;
    

    アップデート 1: -参考までに、以下のように匿名ブロック内で関数を呼び出すことができます

    DECLARE
      function f(param IN VARCHAR2) return varchar2 is
        Result varchar2(32767);
      begin
        with names as(
          SELECT REGEXP_SUBSTR(regexp_replace(replace(param,
                                                      chr(13) || chr(10),
                                                      ','),
                                              '[[:space:]]*',
                                              ''),
                               '[^=]+',
                               1,
                               level) as name
            FROM DUAL
          CONNECT BY LEVEL <= (SELECT REGEXP_COUNT(param, '=') FROM DUAL)
    
           )
    
            select LISTAGG(nvl(regexp_substr(name, '[^,]+', 1, 2),
                               regexp_substr(name, '[^,]+', 1)),
                           ',') WITHIN
             GROUP(
             ORDER BY name)
              INTO Result
              from names;
    
    
        return(Result);
      end f;
    begin
      for i in 1 .. (regexp_count(f('aa = black' || chr(13) || chr(10) ||
                                    'bb = change' || chr(13) || chr(10) ||
                                    'kkk=no'),
                                  ',') + 1) loop
        dbms_output.put_line(regexp_substr(f('aa = black' || chr(13) ||
                                             chr(10) || 'bb = change' ||
                                             chr(13) || chr(10) || 'kkk=no'),
                                           '[^,]+',
                                           1,
                                           i));
      end loop;
    end;
    


    1. EAV over SQL Server

    2. 結果の列名を知らなくてもSQL Server Pivotできますか?

    3. MySQL LIMIT、OFFSETを使用したページネーション

    4. RailsのWHERE句でINの代わりにANYを使用するにはどうすればよいですか?