如何在模式之前获取特定数量的字符

时间:2018-09-18 10:39:02

标签: sql oracle

我表中的值如下:

SER : 3-576509910214, 4182 5979WM

我需要先删除空格。然后在匹配字符串'WM'出现之前或之后获取8个数字。我需要上述值的输出为'41825979'。每次出现“ WM”后,我都需要提取8个数字。

WM可以出现在字符串中的任何位置。

如何在Oracle SQL查询中做到这一点?

2 个答案:

答案 0 :(得分:1)

这将从这样的字符串返回最长为8的数字字符串:

select replace(regexp_substr(replace(str, ' ', ''), '[0-9]{1,8}WM'), 'WM', '')

如果要在之前之后,只需修改模式:

select replace(regexp_substr(replace(str, ' ', ''), '[0-9]{1,8}WM|WM[0-9]{1-8}'), 'WM', '')

答案 1 :(得分:0)

要在WM之前或之后(除去空格后)输入8位数字,请使用以下代码:

WITH Demo(t) AS
(
  SELECT 'SER : 3-576509910214, 4182 5979WM' FROM dual
  UNION ALL
  SELECT 'SER : 3-576509910214, 4182 5 979 WM' FROM dual
  UNION ALL
  SELECT 'SER : 3-576509910214,WM 4182 5979' FROM dual
)
SELECT
  REPLACE(COALESCE(
    REGEXP_SUBSTR(REPLACE(t, ' ', ''), '[0-9]{8}WM'),
    REGEXP_SUBSTR(REPLACE(t, ' ', ''), 'WM[0-9]{8}')
  ), 'WM', '')
FROM Demo