【发布时间】:2023-04-17 15:30:02
【问题描述】:
我需要在 Oracle SQL 中的每个字符之后插入字符串。
例子:
ABC will A,B,C
DEFG will be D,E,F,G
这个问题只给出字符串中的一个字符
【问题讨论】:
我需要在 Oracle SQL 中的每个字符之后插入字符串。
例子:
ABC will A,B,C
DEFG will be D,E,F,G
这个问题只给出字符串中的一个字符
【问题讨论】:
编辑:正如一些人提到的,Oracle 不承认这个正则表达式。所以我的方法是做一个正则表达式来匹配所有字符,在字符后面添加一个逗号,然后删除最后一个逗号。
WITH regex AS (SELECT REGEXP_REPLACE('ABC', '(.)', '\1,') as reg FROM dual) SELECT SUBSTR(reg, 1, length(reg)-1) FROM regex;
请注意,使用rtrim 的解决方案,如果您要解析的字符串有一个结尾逗号并且您不想删除它,则可能会出现错误。
以前的解决方案:(不适用于 Oracle)
检查这是否有效:
SELECT REGEXP_REPLACE('ABC', '(.)(?!$)', '\1,') FROM dual;
它对每个字符执行regexp_replace,但最后一个用于同一字符,后跟一个,
要了解regexp_replace 的工作原理,我推荐您:https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm
【讨论】:
SELECT rtrim(REGEXP_REPLACE('ABC', '(.)', '\1,'),',') "REGEXP_REPLACE" FROM dual;
【讨论】:
你可以这样做:
例如,
SQL> WITH sample_data AS(
2 SELECT 'ABC' str FROM dual UNION ALL
3 SELECT 'DEFG' str FROM dual UNION ALL
4 SELECT 'XYZ' str FROM dual
5 )
6 -- end of sample_data mimicking a real table
7 SELECT str,
8 rtrim(regexp_replace(str, '(\w?)', '\1,'),',') new_str
9 FROM sample_data;
STR NEW_STR
---- ----------
ABC A,B,C
DEFG D,E,F,G
XYZ X,Y,Z
【讨论】:
(1)??
由于没有办法在 Oracle 正则表达式中否定字符串的结尾(不支持环视),您可以使用
SELECT REGEXP_REPLACE(
REGEXP_REPLACE('ABC', '([^,])([^,])','\1,\2'),
'([^,])([^,])',
'\1,\2')
AS Result from dual
请参阅DB Fiddle。这里的重点是使用REGEXP_REPLACE 和([^,])([^,]) 模式两次 来满足连续匹配。
([^,])([^,]) 模式将任何非逗号字符匹配到第 1 组 (\1),然后将任何非逗号字符匹配到第 2 组 (\2),并在它们之间插入逗号。
【讨论】: