1. ホーム
  2. データベース
  3. 神託

Oracleのカンマ区切り文字列を複数行に分割したデータ例

2022-01-18 15:11:25

前置き

最初のアイデアは、データをカットすることで、カンマをカッターとして使うことです。以下、その方法をまとめてみましたので、ご参考にしてください。

1、regexp_substr関数は、文字列を分割するために、正規を通じて、関数の使用。(サポートするためにOracle 10g +バージョンである必要があります)

 REGEXP_SUBSTR関数の書式は以下の通りです。

関数 REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)

__srcstr : 正規化される文字列

__pattern: マッチする正規表現

__position: 正規表現がマッチする文字の開始位置 (デフォルトは 1)

__occurrence : 最初のグループ分割を取得 (最初の文字列は分割の順番にグループ化されます)、デフォルトは1です。

__modifier : パターン('i'は大文字・小文字を区別せず取得、'c'は大文字・小文字を区別して取得します。(デフォルトは'c') 正規表現における文字の大文字・小文字のマッチングに使用する。

-------------------------------------------------------------------------------------------------------------------

  この関数は一度に1つの文字列しか受け取れないので、ちょっと鶏の餌食になりそうです。文字列中のカンマの数は不定なので、カンマが2つあれば、抽出されるフィールドの数は3つです。抽出するフィールドの数を決めるには、connect byコマンドで動的引数で連続値を構成し、置換後の文字列の長さから元の文字列の長さを引いて元の文字列のカンマの数を求め、1を足して抽出する一致するフィールドの数を求める必要があります。

 SQLです。

select bs from cs1_0 where slid='201804100038'
-- The first value after regular splitting
SELECT REGEXP_SUBSTR((select bs from cs1_0 where slid='201804100038'),'[^,]+',1,1,'i') as the result after splitting FROM DUAL;
-- get a column with multiple values so that the results can be displayed in multiple rows 
SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=5;
--- the above REGEXP_SUBSTR ocurrence (identify the first few matching groups) to achieve dynamic parameters, using the connect by combination
SELECT REGEXP_SUBSTR((select bs from cs1_0 where slid='201804100038'),'[^,]+',1,LEVEL,'i') as split result FROM DUAL CONNECT BY LEVEL <=5;
--optimize it (dynamically get the number of rows with matching group identifiers)
select regexp_substr((select bs from cs1_0 where slid='201804100038'),'[^,]+',1,LEVEL,'i') as 分分後结果 FROM dual 
connect by level <= length((select bs from cs1_0 where slid='201804100038'))-length(regexp_replace((select bs from cs1_0 where slid=' 201804100038'),','',''))+1;

2. タイプ型とファンクション機能として実装される

1) Create TYPE type


CREATE OR REPLACE TYPE strsplit_type_12 IS TABLE OF VARCHAR2 (4000)

2) Create function stored functions
create or replace function strsplit_66(p_value varchar2,p_split varchar2 ) --string, cut character
--Cut the string according to specific characters
 return strsplit_type_12
  pipelined is
  v_idx integer;
  v_str varchar2(500);
  v_strs_last varchar2(4000) := p_value;

begin
  loop
    v_idx := instr(v_strs_last, p_split);
    exit when v_idx = 0;
    v_str := substr(v_strs_last, 1, v_idx - 1);
    v_strs_last := substr(v_strs_last, v_idx + 1);
    pipe row(v_str);
  end loop;
  pipe row(v_strs_last);
  return;
end strsplit_66;

SELECT ROWNUM serial number, a.* FROM TABLE(strsplit_66((select bs from cs1_0 where slid='201804100038'), ',')) a;



 テストに

概要

今回はOracleのカンマ区切り文字列の複数行への分割についてご紹介しましたが、Oracleの複数行への分割については、スクリプトハウスの過去記事を検索していただくか、引き続き以下の関連記事をご覧ください。