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

分割時に SQL REGEXP_SUBSTR が null 文字列を返す

    REPLACE を使用するだけです , を使用した標準コード

    SqlFiddleDemo

     with temp as
    (
        select 108 Name, 'test' Project, 'Err1:::Err2:::Err3' Error  from dual
        union all
        select 109, 'test2', 'Err1' from dual
    )
    select distinct
      t.name, t.project,
      trim(regexp_substr(REPLACE(t.error, ':::', ', '), '[^,]+', 1, levels.column_value))  as error
    from 
      temp t,
      table(cast(multiset(select level from dual connect by  level <= length (regexp_replace(REPLACE(t.error, ':::', ', '), '[^,]+'))  + 1) as sys.OdciNumberList)) levels
    order by name
    

    または、区切りの長さで割る必要があります:

    SqlFiddle

    with temp as
    (
        select 108 Name, 'test' Project, 'Err1:::Err2:::Err3' Error  from dual
        union all
        select 109, 'test2', 'Err1:::Err2' from dual
    )
    select distinct
      t.name, t.project,
      trim(regexp_substr(t.error, '[^:::]+', 1, levels.column_value))  as error
    from 
      temp t,
      table(cast(multiset(select level from dual connect by  level <= length (
           regexp_replace(t.error, '[^:::]+'))/3  + 1) as sys.OdciNumberList)) levels
    order by name
    

    実行する理由は次のとおりです。

    SELECT length (regexp_replace('Err1:::Err2:::Err3', '[^:::]+')) + 1 AS l
    FROM dual
    

    これは 7 とあなたを返します:

    SELECT DISTINCT  t.name, t.project,
    trim(regexp_substr(t.error, '[^:::]+', 1, levels.column_value))  as error
    

    regexp_substr を取得しようとします 7 回発生し、そのうち 4 回は NULL になります そして最後に 4 NULL 1 つの NULL に押しつぶされます DISTINCT による .




    1. PostgreSQLコマンドのドキュメント構文を読むにはどうすればよいですか?

    2. 結果行の各行に別のテーブルからカウントを選択します

    3. SQL Server(T-SQL)の特定のパーティションからすべての行を返す

    4. Wordpressカスタムデータベーステーブルが認識されません