使用 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)~ 发生时拆分它。

所以拆分后的预期结果是

  1. RANDOM(NUL)THIS_SHOULD_BE_SPLIT
  2. THIS_IS_NEW(NUL)STRING
  3. 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;

here is a demo

您不能直接将正则表达式中的 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