Oracleのカンマ区切り文字列を複数行に分割したデータ例
前置き
最初のアイデアは、データをカットすることで、カンマをカッターとして使うことです。以下、その方法をまとめてみましたので、ご参考にしてください。
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の複数行への分割については、スクリプトハウスの過去記事を検索していただくか、引き続き以下の関連記事をご覧ください。
関連
-
オラクルにおけるNEXTVALの事例を解説
-
オラクルデータベースに付属するすべてのテーブル構造を説明する(sqlコード)
-
Oracle12Cのデフォルトのユーザー名とシステムパスワードが正しくない場合の解決策
-
Oracle ADGプロセスを構築するDBCAコマンドライン
-
[解決済み】ORA-00932: 整合性のないデータ型: 予想される - CLOB を取得しました。
-
[解決済み】Oracle "SQL Error: Missing IN or OUT parameter at index:: 1" と表示されました。
-
C#からORACLEへの接続が乱れたコードの問題解決法
-
[解決済み] ORA-00900: 無効な SQL 文 - Oracle 10g のプロシージャを実行するとき
-
[解決済み] PLS-00103:次のいずれかを期待しているときに、記号"; "に遭遇しました。
-
[解決済み] ORA-01407:NULLに更新できません。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Oracle Logminer クイックスタート詳細
-
Oracle TriggersとCursorsを高速に学ぶ
-
[解決済み] ORA-01465: BLOB を使用しているとき、Oracle の 16 進数が無効です。
-
[解決済み] ORA-01849: 時間は 1 から 12 の間でなければなりません。
-
[解決済み] ORA-04021: オブジェクトのロック待ちでタイムアウトが発生しました。
-
[解決済み] PLS-00382: 式が不正です。
-
[解決済み] SQLステート [72000]; エラーコード [14300]; JDBCバッチアップデートを実行できませんでした。
-
[解決済み] ORA-00119: 無効な仕様 ORA-00132: 構文エラー
-
[解決済み] 外部キーの追加エラー。ORA-02298: 検証できません - 親キーが見つかりませんでした
-
[解決済み] ORA-01460: 未実装または不当な変換が要求されました。