如何在Oracle中分离多个字符串?

up9lanfz  于 2023-08-04  发布在  Oracle
关注(0)|答案(2)|浏览(100)

如何在Oracle中将“a”、“B”、“c”、“d”分离为a、b、c、d?
最初我使用REGEXP_SUBSTR('a; B;c; d ','[^;]+',1,level)用分隔符分号“分隔值;“,但有时值本身包含分隔符分号,这会导致未找到记录错误

ukdjmx9f

ukdjmx9f1#

假设你的数据是JSON兼容的(文字中的引号用反斜杠转义,文字用逗号分隔),然后使用JSON_TABLE

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

o2g1uqev

o2g1uqev2#

如果在要分隔的标记内使用分隔符,则它不再是分隔符,只有当您有办法在标记内转义分隔符或引用包含分隔符的标记时,您才能够分隔字符串:a;b\;c;da;"b;c",d,但a;b;c;d永远是模糊的。

相关问题