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

Oracleを使用して区切り文字の位置で文字列を分割する

    文字列が1つだけで、常に正確に4つの部分があることがわかっている場合は、標準の文字列関数のみを使用して、このように分割できます(より柔軟ですが、多くの場合低速である正規表現を回避します)。

    :この回答の後半では、可変数の「パーツ」を持つ文字列を扱います。

    with inputs ( str ) as (
           select ',,defoifcd,87765' from dual
         )
    -- end of TEST data; SQL query begins below (use your actual table and column names)
    select substr(str, 1, instr(str, ',') - 1) as part_1,
           substr(str, instr(str, ',') + 1, 
                  instr(str, ',', 1, 2) - instr(str, ',') - 1) as part_2,
           substr(str, instr(str, ',', 1, 2) + 1, 
                  instr(str, ',', 1, 3) - instr(str, ',', 1, 2) - 1) as part_3,
           substr(str, instr(str, ',', -1) + 1) as part_4
    from   inputs;
    
    PART_1   PART_2   PART_3   PART_4
    -------- -------- -------- --------
                      defoifcd 87765
    
    1 row selected.
    

    パーツの数が事前にわからない場合は、別の形式で出力を取得することをお勧めします(以下の出力を参照)。他のすべての処理が完了した後に実行できる列にパーツを配置する必要がある場合、とにかくSQLで実行するのではなく、常にレポートアプリケーションに任せるのが最善です。

    with inputs ( id, str ) as (
           select 1, ',,defoifcd,87765' from dual union all
           select 2, ''                 from dual union all
           select 3, 'a, b, c'          from dual
         )
    -- end of TEST data; SQL query begins below (use your actual table and column names)
    select id, str, level as part_number,
           substr(aug_str, instr(aug_str, ',', 1, level) + 1,
                  instr(aug_str, ',', 1, level + 1) - instr(aug_str, ',', 1, level) - 1) as val
    from   ( select id, str, ',' || str || ',' as aug_str from inputs)
    connect by level <= length(str) - length(translate(str, 'z,', 'z')) + 1
           and prior id = id
           and prior sys_guid() is not null
    ;
    
    ID STR              PART_NUMBER VAL
    -- ---------------- ----------- ----------
     1 ,,defoifcd,87765           1
     1 ,,defoifcd,87765           2
     1 ,,defoifcd,87765           3 defoifcd
     1 ,,defoifcd,87765           4 87765
     2                            1
     3 a, b, c                    1 a
     3 a, b, c                    2  b
     3 a, b, c                    3  c
    
    8 rows selected.
    



    1. MySQL InnoDBの挿入が非常に遅いのはなぜですか?

    2. 画像をvarbinary(max)列に保存する方法は?

    3. PHPでMySQLからBLOB画像データをプルする

    4. このルールが重複キー違反を防止しないのはなぜですか?