2015-12-15 77 views
6

好日子为什么这个正则表达式查询不返回任何结果?

我有有行看起来像

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

我需要找到一个场(和替换我确定后,我选择返回正确的行:))匹配正则表达式的所有记录:

/-\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 
+1

我已经给你一个解决方案,它可以用字符串处理任意长度。请看看是否有机会,谢谢。 –

回答

3

编号:

SQLFiddle

如果你想在实际中pod列更改值,你可以尝试使用UPDATE匹配像[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

尝试:

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

+0

感谢Praveen,这项工作100%我现在怎么能替换表中的所有00 [A-Z]匹配与_MARK_ [A-Z]? – georgelappies

+0

'pod'值是否为具有'xxx-xxx-xxxxxxx-xxx.xxx'模式的固定长度数据? – Praveen

+0

嗨Praveen,不,不是。它始终以BBB-999开头,然后会有数字和字母组合,后跟'\ - [0-9] {3}'或'\ - [0-9] {2} [AZ] {1 }'紧接着.XYZ我需要用你的正则表达式找到的所有00替换_MARK_希望这有道理:) – georgelappies

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]' 
) 

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

点击下面的链接,运行演示:在mysql shouls

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

我现在工作了。诀窍是使用'[0-9]'来表示正则表达式中的任何数字。请尝试SQL小提琴来协助您自己。 –

+0

嗨@ tim-biegeleisen,谢谢你现在正在工作,我怎样才能替换实际表中的select所找到的值,而不仅仅是它在输出中显示? – georgelappies

相关问题