Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在模式之前获取特定数量的字符_Sql_Oracle - Fatal编程技术网

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

Sql 如何在模式之前获取特定数量的字符,sql,oracle,Sql,Oracle,我的表中有如下值: SER : 3-576509910214, 4182 5979WM 我需要先删除空白。然后在匹配字符串出现之前或之后提取8个数字'WM'。我需要将上述值的输出设置为'41825979'。每次出现“WM”后,我需要取8个数字 WM可以出现在字符串中的任何位置 如何在Oracle SQL查询中执行此操作?这将从该字符串返回一个长度不超过8位的字符串: select replace(regexp_substr(replace(str, ' ', ''), '[0-9]{1,8}W

我的表中有如下值:

SER : 3-576509910214, 4182 5979WM
我需要先删除空白。然后在匹配字符串出现之前或之后提取8个数字
'WM'
。我需要将上述值的输出设置为
'41825979'
。每次出现“WM”后,我需要取8个数字

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


如何在Oracle SQL查询中执行此操作?

这将从该字符串返回一个长度不超过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', '')

要在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

看起来不错,它在工作,+1。哦,我明白了:
8个数字在匹配字符串出现之前或之后
。亲爱的匿名者,为了帮助他人,请写清楚有什么问题。单独的向下投票是没有帮助的。这似乎对第一次出现的“WM”有效。在列的值中可以多次出现“WM”。对于多次出现的搜索模式,我如何获取它。@jerry。你的问题没有提到多重匹配。这个问题完全不同,应该作为一个新问题来问。你到底是什么意思?你的标题写的是“之前”,一部分写的是“之前或之后”,第三部分写的是“之后”。