使用sql的regexp\u substr拆分字符串

esbemjvw  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(345)

我需要像这样分开一根绳子

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不确定它如何处理空字符以及是否可以拆分它。
使用~我正在使用~

SELECT REGEXP_SUBSTR(stringval,'[^~]+', 1, LEVEL) AS error_code
FROM DUAL
CONNECT BY REGEXP_SUBSTR(stringval, '[^~]+',1,LEVEL) IS NOT NULL;

不知道如何在这里合并空字符。
woobm2wo

woobm2wo1#

不能直接匹配 ASCII 0 (NUL) 作为正则表达式解析器将处理 ASCII 0 (NULL) 字符作为字符串终止符并结束正则表达式模式,而不是将其用作要匹配的字符。因此,如果要使用正则表达式,则需要替换 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<>在这里摆弄

pw136qt2

pw136qt22#

这样的东西对你合适吗:

SELECT REGEXP_SUBSTR(replace(stringval, '(NUL)~', '~'),'[^~]+', 1, LEVEL) 
       AS error_code 
FROM test
CONNECT BY REGEXP_SUBSTR(stringval, '[^~]+',1,LEVEL) IS NOT NULL;

这是一个演示

相关问题