カンマ区切りの値を含むデータベース列があります。 Oracleで正規表現を使用せずに、この列から個々の値を別の行に取得する方法はありますか。Oracleでカンマ区切りの値を区切ります
-2
A
答えて
0
SO postは、regexp_substrの代わりにXMLを使用しています。
EDITを助け
希望:リンクに従うことをしたくない人のためには、簡単な例は次のようになります。
with testdata as (
select 'a,test,string,for,splitting,values' as col from dual
)
select extractvalue(x.column_value, 'e') as tokens
from testdata, xmltable ('e' passing xmlparse(content '<e>' || replace(col, ',', '</e><e>') || '</e>')) x;
出力:
TOKENS
a
test
string
for
splitting
values
あります制限ちょうどregexpソリューションのように。しかし、このアプローチではregexpを要求どおりに使用していません。
3
コレクションに区切られたリストに変換小さな関数を作成し、別の行としてそれを含めるようにTABLE()
コレクション式を使用します。
PL/SQL関数:
CREATE OR REPLACE FUNCTION split_String(
i_str IN VARCHAR2,
i_delim IN VARCHAR2 DEFAULT ','
) RETURN SYS.ODCIVARCHAR2LIST DETERMINISTIC
AS
p_result SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST();
p_start NUMBER(5) := 1;
p_end NUMBER(5);
c_len CONSTANT NUMBER(5) := LENGTH(i_str);
c_ld CONSTANT NUMBER(5) := LENGTH(i_delim);
BEGIN
IF c_len > 0 THEN
p_end := INSTR(i_str, i_delim, p_start);
WHILE p_end > 0 LOOP
p_result.EXTEND;
p_result(p_result.COUNT) := SUBSTR(i_str, p_start, p_end - p_start);
p_start := p_end + c_ld;
p_end := INSTR(i_str, i_delim, p_start);
END LOOP;
IF p_start <= c_len + 1 THEN
p_result.EXTEND;
p_result(p_result.COUNT) := SUBSTR(i_str, p_start, c_len - p_start + 1);
END IF;
END IF;
RETURN p_result;
END;
/
サンプルデータ:
CREATE TABLE table_name (id, list) AS
SELECT 1, 'a,b,c,d' FROM DUAL UNION ALL -- Multiple items in the list
SELECT 2, 'e' FROM DUAL UNION ALL -- Single item in the list
SELECT 3, NULL FROM DUAL UNION ALL -- NULL list
SELECT 4, 'f,,g' FROM DUAL; -- NULL item in the list
クエリ:
SELECT t.id,
v.column_value AS value,
ROW_NUMBER() OVER (PARTITION BY id ORDER BY ROWNUM) AS lvl
FROM table_name t
LEFT OUTER JOIN
TABLE(split_String(t.list)) v
ON (1 = 1)
が出力:REGEXP_SUBSTRと間違っ
ID VALUE LVL
---------- ------- ----------
1 a 1
1 b 2
1 c 3
1 d 4
2 e 1
3 (NULL) 1
4 f 1
4 (NULL) 2
4 g 3
関連する問題
- 1. カンマ区切りカンマ区切りのコンマ区切り
- 2. カンマ区切り
- 3. パイソン(カンマ区切り値)
- 4. 表示カンマ区切り値:
- 5. カンマ区切りでメッセージを区切ります。
- 6. カンマ区切り号
- 7. カンマ区切りリスト
- 8. OracleでCSV(カンマ区切りの値)を解析します。
- 9. Java - カンマで区切られたカンマ区切りのdouble値とint値
- 10. カンマ区切りのカンマで区切られた
- 11. カンマ区切りの値を変数から区切る
- 12. IEでのカンマ区切り
- 13. SQLでカンマ区切りリスト
- 14. カンマ区切りの値を持つmysql
- 15. インフォーマティカのカンマ区切り
- 16. SQL LIKEのカンマ区切り?
- 17. カンマ区切り値のSQLのexec文
- 18. SQLカンマ区切りの値dml操作
- 19. 正規表現:カンマ区切りの値
- 20. MySQL - FIND_IN_SET(カンマ区切りのフィールド値)
- 21. カンマ区切り - 問題
- 22. 生成カンマ区切り
- 23. PHPカンマ区切り又は
- 24. カンマ区切り文字列
- 25. カンマ区切り整数(C)
- 26. MySQLは、カンマ区切り
- 27. VIM JavaScriptインデントプラグイン - カンマ区切り
- 28. xmlstarlet countカンマ区切り
- 29. 区切り記号として区切り記号の前または後にカンマ区切りでカンマを区切る方法
- 30. スプリングバッチ - カンマ区切り値 - データベースに保存
いただきましたか? – user648026
もちろん、SUBSTRとINSTR(そしておそらくLENGTH)を使うだけです。あなたもSOで検索しましたか?多くの例が見つかります。 – mathguy
正規表現を使用しない場合、おそらく 'regex'タグは必要ありません。 – BriteSponge