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

likeを使用して、変数のさまざまなリストを使用してテーブルをクエリします。

    私があなたの必要性をよく理解しているなら、これは方法かもしれません。

    次のようなテーブルがあるとします:

    create table yourTable(setid, codes, messagedescr) as ( 
      select 1,       'A, B, C, D',  'You can login' from dual union all
      select 2,       'B, C, D'   ,  'You can login for one day' from dual union all
      select 3,       'A, C, E'   ,  'You can login but update your profile' from dual union all
      select 4,       'B, C, E, F',  'You cannot login' from dual
    ).
    

    これは方法かもしれません:

    with inputData(codes) as (
        select listagg(trim (regexp_substr(input_codes, '[^,]+', 1, level))) within group ( order by trim (regexp_substr(input_codes, '[^,]+', 1, level)))
        from ( select 'A, D, C, B' as input_codes from dual )  /* the input string */
        CONNECT BY instr(input_codes, ',', 1, level - 1) > 0
    )    
    select *
    from inputData 
        inner join (
                    select listagg(trim (regexp_substr(codes, '[^,]+', 1, level)))
                             within group ( order by trim (regexp_substr(codes, '[^,]+', 1, level))) as codes,
                            messagedescr
                    from yourTable  
                    CONNECT BY instr(codes, ',', 1, level - 1) > 0
                      and prior setId = setId
                      and prior sys_guid() is not null
                    group by setId, messagedescr
                   )
          using (codes)
    

    ここでの考え方は、入力文字列を多くの行に分割し、結果の行をアルファベット順に集計し、テーブルの値に同じ順序を適用して、順序付けられた文字列が等しいことを確認することです。

    この部分は、入力値を分割、順序付け、および集約するために使用されるため、結果は順序付けられた文字列になります。

    select listagg(trim (regexp_substr(input_codes, '[^,]+', 1, level))) within group ( order by trim (regexp_substr(input_codes, '[^,]+', 1, level)))
        from ( select 'A, D, C, B' as input_codes from dual )  /* the input string */
        CONNECT BY instr(input_codes, ',', 1, level - 1) > 0
    

    与える:

    ABCD
    

    この部分は、テーブルで同じことを行うために使用されます:

    select listagg(trim (regexp_substr(codes, '[^,]+', 1, level)))
             within group ( order by trim (regexp_substr(codes, '[^,]+', 1, level))) as codes,
            messagedescr
    from yourTable  
    CONNECT BY instr(codes, ',', 1, level - 1) > 0
      and prior setId = setId
      and prior sys_guid() is not null
    group by setId, messagedescr  
    

    与える:

    CODES      MESSAGEDESCR
    ---------- -------------------------------------
    ABCD       You can login
    BCD        You can login for one day
    ACE        You can login but update your profile
    BCEF       You cannot login
    

    これらの部分的な結果間の結合は非常に簡単で、(順序付けられた)入力文字列に対応する値(順序付けられた)がテーブルに存在するかどうかをチェックするだけです。



    1. ServiceStack:NuGetとともにインストールされたOrmLiteをテストしていますが、エラーFileNotFoundExceptionが発生します

    2. 外部キーのステータスが行ごとに異なる場合に、ステータスに基づいて親テーブルと子テーブルからデータを取得する方法

    3. JSON引数を使用したPostgresバルクINSERT関数

    4. SELECTAS列がWHERE句に存在しません