オラクルのスプリット関数をカンマ区切りの値に自動で配列する
Split関数は、2つのパラメータ、分割する文字列、文字列を分割するデリミタを受け取り、Id列とData列を持つテーブルを返す必要があります。また、Id列とData列を持つテーブルを返すSplit関数の呼び出し方も教えてください。Id列はシーケンスを含み、data列は文字列のデータを含みます。 例
SELECT*FROM Split('A,B,C,D',',')
結果は以下のような形式になります。
|Id | Data
-- ----
|1 | A |
|2 | B |
|3 | C |
|4 | D |
23
7
このようなテーブルを作成する方法をご紹介します。
ちょっとした工夫(
[^,]
の,
を変数に置き換えるなど)で、表を返すような関数を書くことができます。複数のオプションがあります。詳しくはOracleでカンマ区切りの文字列を行に分割するをご覧ください。
SELECTリストにLEVELを列として追加するだけで、返される各行のsequence番号を得ることができます。または、ROWNUMでも十分です。
以下のSQLのいずれかを使用して、それらをFUNCTIONに含めることができます。
INSTRを CONNECT BY 句で使用します。
以下のSQLを使用して、 FUNCTION; SQL> WITH DATA AS 2 ( SELECT 'word1, word2, word3, word4, word5, word6' str FROM dual 3 ) 4 SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str 5 データから 6 CONNECT BY instr(str, ',', 1, LEVEL - 1) > 0 7 /
STR
ワード1 ワード2 ワード3 ワード4 ワード5 ワード6
6行選択
SQL>
REGEXP_SUBSTR in CONNECT BY 句。
となります。 SQL> WITH DATA AS 2 ( SELECT 'word1, word2, word3, word4, word5, word6' str FROM dual 3 ) 4 SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str 5 データから 6 CONNECT BY regexp_substr(str , '[^,]+', 1, LEVEL) IS NOT NULL 7 /
STR
ワード1 ワード2 ワード3 ワード4 ワード5 ワード6
6行選択
SQL>
CONNECT BY句のREGEXP_COUNTです。
となります。 SQL> WITH DATA AS 2 ( SELECT 'word1, word2, word3, word4, word5, word6' str FROM dual 3 ) 4 SELECT trim(regexp_substr(str, '[^,]+', 1, LEVEL)) str 5 データから 6 レベルで接続
XMLTABLE**の使用について
MODEL**句を使用しています。
使うことができます。 SQL> WITH t AS 2 ( 3 SELECT 'word1, word2, word3, word4, word5, word6' str 4 FROM dual ), 5 モデル_パラメータ AS 6 ( 7 SELECT str AS orig_str , 8 ',' 9 || str 10 || ',' AS mod_str , 11 1 AS start_pos , 12 Length(str) AS end_pos , 13 (Length(str) - Length(Replace(str, ',')))+ 1 AS element_count , 14 0 AS element_no , 15 ROWNUM AS rn 16 FROM t ) 17 SELECT trim(Substr(mod_str, start_pos, end_pos-start_pos)) str 18 FROM ( 19 SELECT * 20 FROM model_param MODEL PARTITION BY (rn, orig_str, mod_str) 21 DIMENSION BY (element_no) 22 MEASURES (start_pos, end_pos, element_count) 23 規則の反復(2000) 24 UNTIL (ITERATION_NUMBER+1 = element_count[0]) 25 ( start_pos[ITERATION_NUMBER+1] = instr(cv(mod_str), ',', 1, cv(element_no))+ 1, 26 end_pos[iteration_number+1] = instr(cv(mod_str), ',', 1, cv(element_no) + 1) )) 27 WHERE element_no != 0 28 ORDER BY mod_str , 29 element_no 30 /
STR
ワード1 ワード2 ワード3 ワード4 ワード5 ワード6
6行選択
SQL>
Oracleが提供しているDBMS_UTILITYパッケージを利用することもできます。これは様々なユーティリティーサブプログラムを提供します。そのような便利なユーティリティの1つがCOMMA_TO_TABLEプロシージャで、これはカンマで区切られた名前のリストをPL/SQLの名前のテーブルに変換します。
DBMS_UTILITY.COMMA_TO_TABLE]2を読む
Oracle Setup :
機能が必要な場合はこちらをお試しください。
まず、型を作ります。
次に、関数を作ります。
この「分割」機能を使用します。
この関数は、入力文字列MYSTRINGのn番目の部分を返します。 2番目の入力パラメータはセパレータです。、SEPARATOR_OF_SUBSTR。 3番目のパラメーターは、必要なN番目のパートです。
注:MYSTRINGはセパレーターで終了する必要があります。
これが一部のボディに役立つことを願っています。このような機能をループで使用して、すべての値を分離できます。
ここでNO_OF_RECORDS、PK_RECORDは一時変数です。
これが役立つことを願っています。
以下のようにしてください。