bugfix> sql > 投稿

私は以下の特定の形式で記録がある列を持っています:-

ParamName1+ParamVal1;ParamName2+ParamVal2;ParamName3+ParamVal3;

現在、以下のクエリロジックを使用していますが、このロジックは、検索ParamNameの一部が一致する値ももたらします。

TRIM(REGEXP_REPLACE(REGEXP_SUBSTR(TO_CHAR(ITEM_ATRS_LIST),'ID\+[^;]*'),'ID\+',''))

たとえば、値が EmpID+1234;Name+ABCD;Age+21; の場合クエリを使用して

TRIM(REGEXP_REPLACE(REGEXP_SUBSTR(TO_CHAR(ITEM_ATRS_LIST), 'ID\+[^;]*'),'ID\ + ',''))

値1234を提供しますが、 NULL が必要ですParamName IDが存在しないため。

検索paramNameと完全に一致する値をもたらす方法はありますか?

回答 2 件
  • 「EmpID」などの属性の値を探しています。これは私が思いついたものです:

    regexp_replace( regexp_substr(item_atrs_list, 
                                  '(^|;)EmpID\+.*?(;|$)'
                                 ),
                    '^.*?\+(.*?)\;?$',
                    '\1'
                  )
    
    

    (^|;)EmpID\+.*?(;|$)' の説明 :

    (^|;)  文字列の先頭または文字列内のセミコロン

    EmpID  その後にEmpID

    \+  プラス記号が続きます

    .*?(;|$)'  多分いくつかの文字(値)が続き、最後にセミコロンが続くか、文字列の最後を打つ

    '^.*?\+(.*?)\;?$' の説明 :

    ^  文字列の始まり

    ^.*?\+  おそらくいくつかの文字が続き、プラス記号(つまり、「;EmpID +」または「EmpID +」)

    (.*?)\;?$'  場合によっては、記憶するいくつかの文字(値)が続き、場合によってはセミコロン、文字列の末尾が続きます

    \1 の説明 :

    記憶した最初の(そして唯一の)文字列、つまり値

    (正規表現はそれほど得意ではありません。これを達成するためのはるかに簡単な方法があるかもしれません。前述のように、とにかくPL/SQLなどのプログラミング言語を使用します。)

  • Common Table Expressions(CTE)を使用してアプローチする別の方法を次に示します。最初の「tbl」は、元のデータのソースを設定するだけです。 'params'は、名前と値のペアのテーブルを作成し、connect byを使用してループし、セミコロンの区切りで分割し、さらにプラス記号で区切ります。次に、名前が一致する場所を選択します。

    -- Original data
    with tbl(data) as (
      select 'EmpID+1234;Name+ABCD;Age+21;' from dual
    ),
    -- make a table of name-value pairs
    params(name, value) as (
      select regexp_substr(data, '(^|;)(.*?)\+', 1, level, NULL, 2),
             regexp_substr(data, '\+(.*?)(;|$)', 1, level, NULL, 1)
      from tbl
      connect by level <= regexp_count(data, ';')
    )
    --select * from params;
    -- Get the value for the name
    select name, value
    from params
    where name = 'EmpID';
    
    

あなたの答え