为什么这个正则表达式查询没有返回任何结果?

时间:2015-12-15 06:20:06

标签: mysql sql

美好的一天

我有一个字段看起来像

BBB-888-8557ZZV-003.XYZ
BBB-999-8787ZZV-00D.XYZ

我需要找到(并在我确认我的select返回正确的行后替换:))所有与正则表达式匹配的记录:

/-\d\d[A-Z]/g

因此所有带有减号的字段后跟两个数字后跟一个字母。

我也只需要过滤掉其中包含999的字段。

我尝试了以下SQL但它没有返回任何结果:

SELECT * 
FROM  `track` 
WHERE (
pod LIKE  "BBB-999%"
AND pod
REGEXP  '/-\d\d[A-Z]/g'
)

此外,一旦找到所有这些字段,将会更快地替换所有这些字段:

BBB-999-8787ZZV-_MARK_D.XYZ

2 个答案:

答案 0 :(得分:3)

在限制查询后,您可以使用CONCAT()功能在输出中获取替换。

SELECT CONCAT(SUBSTRING(pod, 1, LENGTH(pod) - LOCATE('-', REVERSE(pod)) + 1),
              '_MARK_D.XYZ')
FROM `track`
WHERE
(
    pod LIKE  "BBB-999%"
    AND pod REGEXP  '-[0-9][0-9][A-Z]'
)

出于某种原因,我需要在MySQL正则表达式中使用[0-9]来使其正常工作。

点击以下链接查看正在运行的演示:

SQLFiddle

如果您想实际更改pod列中的值,可以尝试UPDATE

UPDATE `track`
SET pod = CONCAT(SUBSTRING(pod, 1, LENGTH(pod) - LOCATE('-', REVERSE(pod)) + 1),
                 '_MARK_D.XYZ')
WHERE
(
    pod LIKE  "BBB-999%"
    AND pod REGEXP  '-[0-9][0-9][A-Z]'
)

答案 1 :(得分:3)

mysql中的数字与[0-9] or [[:digit:]]一样匹配 \d无法按预期工作。 link

试;

SELECT * 
FROM  `track` 
WHERE
pod LIKE  "BBB-999%" and
pod REGEXP  '\-[0-9]{2}[A-Z]{1}'

SELECT * 
FROM  `track` 
WHERE
pod LIKE  "BBB-999%" and
pod REGEXP  '\-[[:digit:]]{2}[A-Z]{1}'

sql fiddle demo

使用-00[A-Z].XYZ更新包含-MARK[A_Z].XYZ的字段

  1. 然后字符串的长度不同(来自评论)
  2. 最后8个字符可以是\-[0-9]{3}.XYZ\-[0-9]{2}[A-Z]{1}.XYZ
  3. 尝试:

    UPDATE `track`
    SET `pod` = concat(reverse(substr(reverse( `pod` ) from 8)), 'MARK', substr( `pod`  from -5)) 
    WHERE
    `pod` LIKE  "BBB-999%" and
    `pod` REGEXP  '\-0{2}[A-Z]{1}';
    

    sql fiddle demo