使用 SQL 的 REGEXP_SUBSTR 拆分字符串
Split String using SQL's REGEXP_SUBSTR
我需要像这样拆分字符串
RANDOM(NUL)THIS_SHOULD_BE_SPLIT(NUL)~THIS_IS_NEW(NUL)STRING(NUL)~THIS_IS_ANOTHER_STRING(NUL)
(NUL)
表示一个ASCII值为0
的字符。不知道怎么在这里输入。
我需要在 (NUL)~
发生时拆分它。
所以拆分后的预期结果是
RANDOM(NUL)THIS_SHOULD_BE_SPLIT
THIS_IS_NEW(NUL)STRING
THIS_IS_ANOTHER_STRING(NUL)
使用 OracleDB 不确定它如何处理 NULL 字符以及是否可以拆分它。
拆分使用~我正在使用
SELECT REGEXP_SUBSTR(stringval,'[^~]+', 1, LEVEL) AS error_code
FROM DUAL
CONNECT BY REGEXP_SUBSTR(stringval, '[^~]+',1,LEVEL) IS NOT NULL;
不知道如何在此处合并 NULL 字符。
这样的事情对你来说是否合适:
SELECT REGEXP_SUBSTR(replace(stringval, '(NUL)~', '~'),'[^~]+', 1, LEVEL)
AS error_code
FROM test
CONNECT BY REGEXP_SUBSTR(stringval, '[^~]+',1,LEVEL) IS NOT NULL;
您不能直接将正则表达式中的 ASCII 0 (NUL)
字符匹配为 regular expression parser will treat an ASCII 0 (NULL)
character as a string terminator and end the regular expression pattern 而不是将其作为字符进行匹配。所以,如果你想使用正则表达式,你需要用占位符字符串替换所有出现的 ASCII 0 (NUL)
字符,然后在拆分时匹配它,然后恢复未拆分的 ASCII 0 (NUL)
字符然后。但是您需要确保您的占位符永远不会出现在字符串的其他地方。
相反,您可以使用 CHR(0)
来匹配 NUL
字符。此方法使用简单的字符串函数(而不是不能直接处理 ASCII 0 (NUL)
个字符的慢速正则表达式)并且可以处理多个输入行:
WITH data ( value ) AS (
SELECT 'RANDOM' || CHR(0)
|| 'THIS_SHOULD_BE_SPLIT' || CHR(0)
|| '~THIS_IS_NEW' || CHR(0)
|| 'STRING' || CHR(0)
|| '~THIS_IS_ANOTHER_STRING' || CHR(0)
FROM DUAL
UNION ALL
SELECT '12345' || CHR(0)
|| '67890' || CHR(0)
|| '~23456'
FROM DUAL
),
split_positions ( value, start_pos, end_pos ) AS (
SELECT value, 1, INSTR( value, CHR(0) || '~' )
FROM data
UNION ALL
SELECT value, end_pos + 2, INSTR( value, CHR(0) || '~', end_pos + 2 )
FROM split_positions
WHERE end_pos > 0
)
SELECT CASE end_pos
WHEN 0
THEN SUBSTR( value, start_pos )
ELSE SUBSTR( value, start_pos, end_pos - start_pos )
END AS value
FROM split_positions;
输出:
| VALUE |
| :------------------------------ |
| RANDOM(NUL)THIS_SHOULD_BE_SPLIT |
| 12345(NUL)67890 |
| THIS_IS_NEW(NUL)STRING |
| 23456 |
| THIS_IS_ANOTHER_STRING(NUL) |
(注意:NUL
字符在输出中再次被 (NUL)
字符串替换,因为 db<>fiddle 不喜欢显示该字符。 )
db<>fiddle here
我需要像这样拆分字符串
RANDOM(NUL)THIS_SHOULD_BE_SPLIT(NUL)~THIS_IS_NEW(NUL)STRING(NUL)~THIS_IS_ANOTHER_STRING(NUL)
(NUL)
表示一个ASCII值为0
的字符。不知道怎么在这里输入。
我需要在 (NUL)~
发生时拆分它。
所以拆分后的预期结果是
RANDOM(NUL)THIS_SHOULD_BE_SPLIT
THIS_IS_NEW(NUL)STRING
THIS_IS_ANOTHER_STRING(NUL)
使用 OracleDB 不确定它如何处理 NULL 字符以及是否可以拆分它。
拆分使用~我正在使用
SELECT REGEXP_SUBSTR(stringval,'[^~]+', 1, LEVEL) AS error_code
FROM DUAL
CONNECT BY REGEXP_SUBSTR(stringval, '[^~]+',1,LEVEL) IS NOT NULL;
不知道如何在此处合并 NULL 字符。
这样的事情对你来说是否合适:
SELECT REGEXP_SUBSTR(replace(stringval, '(NUL)~', '~'),'[^~]+', 1, LEVEL)
AS error_code
FROM test
CONNECT BY REGEXP_SUBSTR(stringval, '[^~]+',1,LEVEL) IS NOT NULL;
您不能直接将正则表达式中的 ASCII 0 (NUL)
字符匹配为 regular expression parser will treat an ASCII 0 (NULL)
character as a string terminator and end the regular expression pattern 而不是将其作为字符进行匹配。所以,如果你想使用正则表达式,你需要用占位符字符串替换所有出现的 ASCII 0 (NUL)
字符,然后在拆分时匹配它,然后恢复未拆分的 ASCII 0 (NUL)
字符然后。但是您需要确保您的占位符永远不会出现在字符串的其他地方。
相反,您可以使用 CHR(0)
来匹配 NUL
字符。此方法使用简单的字符串函数(而不是不能直接处理 ASCII 0 (NUL)
个字符的慢速正则表达式)并且可以处理多个输入行:
WITH data ( value ) AS (
SELECT 'RANDOM' || CHR(0)
|| 'THIS_SHOULD_BE_SPLIT' || CHR(0)
|| '~THIS_IS_NEW' || CHR(0)
|| 'STRING' || CHR(0)
|| '~THIS_IS_ANOTHER_STRING' || CHR(0)
FROM DUAL
UNION ALL
SELECT '12345' || CHR(0)
|| '67890' || CHR(0)
|| '~23456'
FROM DUAL
),
split_positions ( value, start_pos, end_pos ) AS (
SELECT value, 1, INSTR( value, CHR(0) || '~' )
FROM data
UNION ALL
SELECT value, end_pos + 2, INSTR( value, CHR(0) || '~', end_pos + 2 )
FROM split_positions
WHERE end_pos > 0
)
SELECT CASE end_pos
WHEN 0
THEN SUBSTR( value, start_pos )
ELSE SUBSTR( value, start_pos, end_pos - start_pos )
END AS value
FROM split_positions;
输出:
| VALUE | | :------------------------------ | | RANDOM(NUL)THIS_SHOULD_BE_SPLIT | | 12345(NUL)67890 | | THIS_IS_NEW(NUL)STRING | | 23456 | | THIS_IS_ANOTHER_STRING(NUL) |
(注意:NUL
字符在输出中再次被 (NUL)
字符串替换,因为 db<>fiddle 不喜欢显示该字符。 )
db<>fiddle here