我有这个SQL条件,它应该检索满足给定regexp条件的所有行:
country REGEXP ('^(USA|Italy|France)$')
但是,我需要添加一个模式来检索所有空白的国家/地区值。目前我正在使用这个条件
country REGEXP ('^(USA|Italy|France)$') OR country = ""
如何在不包含OR子句的情况下实现相同的效果?
谢谢, 欧文
答案 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