MySQL REGEXP:匹配空白条目

Erw*_*win 5 regex mysql

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

country REGEXP ('^(USA|Italy|France)$')
Run Code Online (Sandbox Code Playgroud)

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

country REGEXP ('^(USA|Italy|France)$') OR country = ""
Run Code Online (Sandbox Code Playgroud)

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

谢谢,欧文

Ben*_*owe 5

这应该工作:

country REGEXP ('^(USA|Italy|France|)$')
Run Code Online (Sandbox Code Playgroud)

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

country IN ('USA','Italy','France', '')
Run Code Online (Sandbox Code Playgroud)

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

  • @Erwin:`\ s*`的唯一问题是它将匹配'空白'条目,例如3个空格.如果您的数据库中没有这样的条目,那么它应该没问题. (2认同)

gna*_*arf 5

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

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


Sen*_*ful 2

你可以尝试:

country REGEXP ('^(USA|Italy|France|)$')
Run Code Online (Sandbox Code Playgroud)

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

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

country REGEXP ('^(USA|Italy|France)$|^$')
Run Code Online (Sandbox Code Playgroud)

请注意,您不能使用正则表达式:^(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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它返回的正是您想要的。

如果您想将空白值视为相同(例如 0 个空格和 5 个空格都算作空白),您应该使用正则表达式:

country REGEXP ('^(USA|Italy|France|\s*)$')
Run Code Online (Sandbox Code Playgroud)

这将导致上一个示例中的最后一行的行为有所不同,即:

select ' ' regexp '^(USA|Italy|France|\s*)$'
> 1
Run Code Online (Sandbox Code Playgroud)