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

カンマ区切りの値をOracleの列に分割します

    注意してください! '[^、]+'形式のregexp_substr式 リストにnull要素があり、その項目またはその次の項目が必要な場合は、期待値を返しません。 4番目の要素がNULLであり、5番目の要素が必要であり、したがって「5」が返されることを期待するこの例を考えてみます。

    SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;
    
    R
    -
    6
    

    サプライズ!実際の5番目の要素ではなく、5番目のNON-NULL要素を返します。間違ったデータが返され、あなたはそれを捕まえることさえできないかもしれません。代わりにこれを試してください:

    SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;
    
    R
    -
    5
    

    したがって、上記の修正されたREGEXP_SUBSTRは、0個以上のコンマ区切り文字の後にコンマまたは行の終わりが続く5番目のオカレンスを探すように指示します(次の区切り文字は、コンマまたは行の終わりになります)。見つかったら、最初のサブグループ(コンマまたは行末を含まないデータ)を返します。

    検索一致パターン'(。*?)(、| $)' 説明:

    (             = Start a group
    .             = match any character
    *             = 0 or more matches of the preceding character
    ?             = Match 0 or 1 occurrences of the preceding pattern
    )             = End the 1st group
    (             = Start a new group (also used for logical OR)
    ,             = comma
    |             = OR
    $             = End of the line
    )             = End the 2nd group
    

    編集:より多くの情報が追加され、正規表現が簡略化されました。

    簡単に再利用できるように、これを関数にカプセル化するための詳細と提案については、この投稿を参照してください。正規表現でリストからn番目の値を選択し、nullを許可する'[^、]+' 問題があります。残念ながら、これは、リストの解析方法に関する質問の回答として最も一般的に表示される正規表現形式です。 '[^、]+'によって返されるすべての誤ったデータを考えると震えます !



    1. ディレクトリに保存する前にアップロードしたファイルの名前を変更するにはどうすればよいですか?

    2. IDEF1X表記

    3. 'WHERE(col1、col2)<(val1、val2)'のSQL構文用語

    4. PHPとMySQL:mysqli_num_rows()は、パラメーター1がmysqli_resultであると想定しており、ブール値が指定されています