首页 > 解决方案 > WHERE colname LIKE '% %' OR colname LIKE '% % %' 返回包含四个单词的行

问题描述

以下代码应该返回城市名称为两个或三个单词的行,但它也返回一个包含四个单词的行:

SELECT FirstName  ||' '|| LastName AS 'Full Name', City, Country, Email, Phone 
FROM customers  
WHERE City LIKE '% %' OR City LIKE '% % %';

[查询输出]

1

如果我使用以下三个代码中的任何一个,就会出现 São José dos Campos:

LIKE '% %' 
 
LIKE '% % %'

LIKE '% % % %'

为什么会这样?

标签: sql

解决方案


其他答案已经解释了为什么你得到你的答案——带有 LIKE 的 % 通配符也匹配空格字符——但没有人解释如何得到你想要的。

这将做到:

WHERE LENGTH(City) - LENGTH(REPLACE(City, ' ', '')) IN (1,2)

RDBMS 的语法会有所不同(例如,SQL Server 将其称为 LEN() 函数)。

这样做是获取 City 字段并将每个空格替换为空字符串,这有效地删除了该字符。然后它从包含空格的 City 的长度中减去长度。这会告诉您 City 字段中有多少空间。然后,您只需查找具有正确空格数的 City 字段。1 个空格表示两个单词,以此类推。

请注意某些 RDBMS 中的前导或尾随空格以及连续空格。

如果您需要使用 LIKE 运算符,您可以尝试这样的操作:

WHERE City LIKE '% %'
    AND City NOT LIKE '% % % %'

这将返回城市至少拥有一个空间但少于三个或更多空间的地方。在这里,使用 1 个空格模式匹配 2 个空格和 3 个空格模式匹配 4 个空格的事实对我们有利!您仍然需要注意连续的空格和前导或尾随空格。这可能会产生意想不到的结果。

您必须进行测试以查看哪个选项在您的系统中表现更好。

一些 RDBMS 会为您提供扩展的 LIKE 或完整的正则表达式选项,它们甚至可以比上面的更好。


推荐阅读