MySQL REGEXP:匹配空白条目

时间:2010-06-17 23:41:00

标签: mysql regex

我有这个SQL条件,它应该检索满足给定regexp条件的所有行:

country REGEXP ('^(USA|Italy|France)$')

但是,我需要添加一个模式来检索所有空白的国家/地区值。目前我正在使用这个条件

country REGEXP ('^(USA|Italy|France)$') OR country = ""

如何在不包含OR子句的情况下实现相同的效果?

谢谢, 欧文

3 个答案:

答案 0 :(得分:5)

这应该有效:

country REGEXP ('^(USA|Italy|France|)$')

但从性能的角度来看,您可能希望使用IN语法

country IN ('USA','Italy','France', '')

后者应该更快,因为REGEXP可能非常慢。

答案 1 :(得分:5)

没有理由不能使用$(匹配字符串的结尾)填写“空子表达式”问题...

看起来有点奇怪,但country REGEXP ('^(USA|Italy|France|$)$')实际上会起作用

答案 2 :(得分:2)

你可以尝试:

country REGEXP ('^(USA|Italy|France|)$')

我刚刚在|之后添加了另一个France,基本上应该告诉它也匹配与^$相同的country = ''

更新,因为此方法不起作用,我建议您使用此正则表达式:

country REGEXP ('^(USA|Italy|France)$|^$')

请注意,您无法使用正则表达式:^(USA|Italy|France|.{0})$,因为它会抱怨存在空子表达式。虽然^(USA|Italy|France)$|^.{0}$可行。

以下是此正则表达式的返回值的一些示例:

select '' regexp '^(USA|Italy|France)$|^$'
> 1
select 'abc' regexp '^(USA|Italy|France)$|^$'
> 0
select 'France' regexp '^(USA|Italy|France)$|^$'
> 1
select ' ' regexp '^(USA|Italy|France)$|^$'
> 0

如您所见,它会准确地返回您想要的内容。

如果要将空白值视为相同(例如0空格和5空格都计为空白),则应使用正则表达式:

country REGEXP ('^(USA|Italy|France|\s*)$')

这将导致前一个示例中的最后一行表现不同,即:

select ' ' regexp '^(USA|Italy|France|\s*)$'
> 1