SELECT j.value
FROM table_name t
CROSS APPLY JSON_TABLE(
'[' || t.list || ']',
'$[*]'
COLUMNS
value VARCHAR2(10) PATH '$'
) j
字符串 其中,对于样本数据:
CREATE TABLE table_name(list VARCHAR2(100));
INSERT INTO table_name (list) VALUES ( '"a","b","c","d"' );
INSERT INTO table_name (list) VALUES ( '"noquotes","\"quotes\"","comma,here"' );
型 输出: | VALUE | | ------------ | | a | | b | | c | | d | | noquotes | | "quotes" | | comma,here | fiddle 如果你的数据是CSV兼容的(字符串中的引号通过加倍来转义,文字用逗号分隔,但可以是任何分隔符),那么你可以使用递归子查询和正则表达式:
WITH matches (list, match, epos) AS (
SELECT list,
REPLACE(REGEXP_SUBSTR(list, '"(([^"]|"")+)"(,|$)', 1, 1, NULL, 1), '""', '"'),
REGEXP_INSTR(list, '"(([^"]|"")+)"(,|$)', 1, 1, 1)
FROM table_name
UNION ALL
SELECT list,
REPLACE(REGEXP_SUBSTR(list, '"(([^"]|"")+)"(,|$)', epos, 1, NULL, 1), '""', '"'),
REGEXP_INSTR(list, '"(([^"]|"")+)"(,|$)', epos, 1, 1)
FROM matches
WHERE epos > 0
AND epos < LENGTH(list)
)
SEARCH DEPTH FIRST BY list SET order_id
SELECT match
FROM matches
型 其中,对于样本数据:
CREATE TABLE table_name(list VARCHAR2(100));
INSERT INTO table_name (list) VALUES ( '"a","b","c","d"' );
INSERT INTO table_name (list) VALUES ( '"noquotes","""quotes""","comma,here"' );
型 输出: | MATCH | | ------------ | | a | | b | | c | | d | | noquotes | | "quotes" | | comma,here | fiddle的
2条答案
按热度按时间ukdjmx9f1#
假设你的数据是JSON兼容的(文字中的引号用反斜杠转义,文字用逗号分隔),然后使用
JSON_TABLE
:字符串
其中,对于样本数据:
型
输出:
| VALUE |
| ------------ |
| a |
| b |
| c |
| d |
| noquotes |
| "quotes" |
| comma,here |
fiddle
如果你的数据是CSV兼容的(字符串中的引号通过加倍来转义,文字用逗号分隔,但可以是任何分隔符),那么你可以使用递归子查询和正则表达式:
型
其中,对于样本数据:
型
输出:
| MATCH |
| ------------ |
| a |
| b |
| c |
| d |
| noquotes |
| "quotes" |
| comma,here |
fiddle的
o2g1uqev2#
如果在要分隔的标记内使用分隔符,则它不再是分隔符,只有当您有办法在标记内转义分隔符或引用包含分隔符的标记时,您才能够分隔字符串:
a;b\;c;d
或a;"b;c",d
,但a;b;c;d
永远是模糊的。