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

フィールドの一部をクエリの値に置き換えます

    おそらく最も効率的ではありませんが、再帰的に機能します(つまり、crit_descriptionの場合) それ自体に「プレースホルダー」が含まれ、それらも展開されます。 (以下に示すものよりも単純な最初の解決策では、この再帰的な手順は実行されませんでした。)追加した3番目のサンプル入力を参照してください。もう少しクリーンアップできたら、後でまた投稿します。

    注:これは、すべての「プレースホルダー」が実際にcriteria_infoにあることを前提としています。 テーブル;それらが見つからない場合に何が起こるかをテストしませんでした。要件を述べるOP。

    with
         inputs ( criteria ) as (
           select '$1 = True' from dual union all
           select '$2 > $3'   from dual union all
           select '$1 = $4'   from dual
         ),
         criteria_info ( crit_id, crit_description ) as (
           select 1, 'Example 1' from dual union all
           select 2, 'Example 2' from dual union all
           select 3, 'Example 3' from dual union all
           select 4, '$2 + $3'   from dual
         ),
         rec ( criteria, new_str ) as (
           select  criteria, criteria
             from  inputs        
           union all       
           select  r.criteria, 
                   regexp_replace(r.new_str, '\$\d+', c.crit_description, 1, 1)
             from  rec r inner join criteria_info c
                   on to_number(regexp_substr(r.new_str, '\$(\d+)', 1, 1, null, 1)) = c.crit_id
             where regexp_substr(r.new_str, '\$\d+') is not null
         )
    select criteria, new_str
    from   rec
    where  regexp_substr(new_str, '\$\d+') is null
    ;
    
    
    CRITERIA  NEW_STR
    --------- ------------------------------------
    $1 = True Example 1 = True
    $2 > $3   Example 2 > Example 3
    $1 = $4   Example 1 = Example 2 + Example 3
    
    3 rows selected.
    


    1. 最新の10行を除くすべての行をテーブルから削除する方法

    2. Oracle DB に接続できず、java.sql.SQLException としてエラーが発生します:Io 例外:ネットワーク アダプタが接続を確立できませんでした

    3. RLIKEがMySQLでどのように機能するか

    4. Postgresドロップデータベースエラー:pq:現在開いているデータベースをドロップできません