Oracle Regex -使用多个分隔符拆分字符串

x7yiwoj4  于 2023-08-04  发布在  Oracle
关注(0)|答案(1)|浏览(118)

我正在寻找目前在甲骨文拆分一个字符串由一个以上的字符。
现在我用一个空格来分割一组数字,如下所示:

SELECT regexp_substr('123 456', '(^| )([^ ]*)') from dual
SELECT regexp_substr('123 456', '(^| )([^ ]*)', 1, 2, null, 2) from dual

字符串
等等,其返回123,然后456。
然而,我希望有一个场景,我可以输入“123 456-789”,并能够分裂成“123”“456”“789”的数字。
我试过了

(^| )([^ ]*)|^[^-]*[^ -]


作为我的新正则表达式,但没有乐趣。

ecfdbz9o

ecfdbz9o1#

您可以用途:

SELECT value,
       REGEXP_SUBSTR(value, '(^|[ -])([^ -]*)', 1, 1, null, 2) AS first,
       REGEXP_SUBSTR(value, '(^|[ -])([^ -]*)', 1, 2, null, 2) AS second,
       REGEXP_SUBSTR(value, '(^|[ -])([^ -]*)', 1, 3, null, 2) AS third
FROM   table_name

字符串
或者,更简单地说,不要寻找分隔符,只寻找数字:

SELECT value,
       REGEXP_SUBSTR(value, '\d+', 1, 1) AS first,
       REGEXP_SUBSTR(value, '\d+', 1, 2) AS second,
       REGEXP_SUBSTR(value, '\d+', 1, 3) AS third
FROM   table_name


其中,对于样本数据:

CREATE TABLE table_name (value) AS
SELECT '123 456'     FROM DUAL UNION ALL
SELECT '123-456 789' FROM DUAL;


两个输出:
| 第一|第二次|第三| THIRD |
| --|--|--| ------------ |
| 一百二十三|四五六| * 空 *| null |
| 一百二十三|四五六|七八九| 789 |
然而,如果你只有单个字符分隔符,你可以使用简单的字符串函数(这是更多的类型,但可能更有效):

SELECT value,
       CASE
       WHEN sep1 > 0 THEN SUBSTR(value, 1, sep1 - 1)
       ELSE value
       END AS first,
       CASE
       WHEN sep2 > 0 THEN SUBSTR(value, sep1 + 1, sep2 - sep1 - 1)
       WHEN sep1 > 0 THEN SUBSTR(value, sep1 + 1)
       END AS second,
       CASE
       WHEN sep2 > 0 THEN SUBSTR(value, sep2 + 1)
       END AS third
FROM   (
  SELECT value,
         normalised_value,
         INSTR(normalised_value, ' ', 1, 1) AS sep1,
         INSTR(normalised_value, ' ', 1, 2) AS sep2
  FROM   (
    SELECT value,
           TRANSLATE(value, ' -', '  ') AS normalised_value
    FROM   table_name
  )
)


具有相同的输出。
fiddle

相关问题