下面的代码应该返回城市名称是两个或三个单词的行,但它也返回一个包含四个单词的行:
SELECT FirstName ||' '|| LastName AS 'Full Name', City, Country, Email, Phone
FROM customers
WHERE City LIKE '% %' OR City LIKE '% % %';
[查询输出]
如果我使用以下三个代码中的任何一个,就会出现 São José dos Campos:
LIKE '% %'
LIKE '% % %'
LIKE '% % % %'
为什么会这样?
答案 0 :(得分:3)
其他答案已经解释了为什么你会得到你的答案——带有 LIKE 的 % 通配符也匹配空格字符——但没有人解释如何得到你想要的。
这样做:
WHERE LENGTH(City) - LENGTH(REPLACE(City, ' ', '')) IN (1,2)
RDBMS 的语法会有所不同(例如,SQL Server 将其称为 LEN() 函数)。
这样做是取 City 字段并用空字符串替换每个空格,这有效地删除了该字符。然后它从带有空格的城市的长度中减去长度。这会告诉您 City 字段中有多少个空间。然后,您只需查找具有正确空格数的 City 字段。 1个空格表示两个词等
注意某些 RDBMS 中的前导或尾随空格以及连续空格。
如果您需要使用 LIKE 运算符,您可以尝试这样的操作:
WHERE City LIKE '% %'
AND City NOT LIKE '% % % %'
那将返回城市至少有一个空间,但少于三个或更多的地方。在这里,使用 1 个空格模式匹配 2 个空格和 3 个空格模式匹配 4 个空格的事实对我们有利!您仍然需要注意连续空格和前导或尾随空格。这可能会产生意想不到的结果。
您必须进行测试,看看哪个选项在您的系统中表现更好。
某些 RDBMS 会为您提供扩展的 LIKE 或完整的正则表达式选项,它们的效果甚至比上面的更好。
答案 1 :(得分:1)
通配符 %
匹配任何内容,包括空格。特别是像 '% %'
这样的模式将匹配 'São José dos Campos'
因为:
%
匹配 "São José dos"
,第二个 %
匹配 "Campos"
,或%
匹配 "São José"
,第二个 %
匹配 "dos Campos"
,或%
匹配 "São"
,第二个 %
匹配 "José dos Campos"
。您没有提到您使用的是哪个数据库,但大多数数据库引擎现在都提供正则表达式匹配。使用这些,您可以精确地搜索非常具体的模式。
答案 2 :(得分:0)
符号 %
表示任何东西,包括任意数量的空格。
答案 3 :(得分:0)
这是因为“谁可以做的最多,谁可以做的最少”。
当使用 LIKE
语句时,%
不是“一个词”而是“任何模式”。因此,% %
的意思不是“用空格分隔的两个单词”,而是“任何模式,后跟一个空格,后跟任何模式”。这实际上让您查找至少包含一个空格的字符串。
原因如下:如果一个字符串包含四个空格,它确实包含其中两个。所以寻找这种字符串实际上匹配每一个包含两个或更多空格的字符串,从而匹配两个、三个、四个或更多的单词。
答案 4 :(得分:0)
也许你的意思
SELECT FirstName ||' '|| LastName AS 'Full Name', City, Country, Email, Phone
FROM customers
WHERE City LIKE '% %'
and City not LIKE '% % % %'
这意味着需要至少有一个空格,但不能有 3 个或更多空格。
答案 5 :(得分:0)
在 SQL 中,% 是零、一个或多个字符,包括空格。因此,这些城市之间有一个、两个或多个空格的城市将在 LIKE "% %" 中匹配。
如果您希望城市内只有一两个空间,您可以试试这个:
WHERE City LIKE '% %' AND City NOT LIKE '% % % %';
但如果城市有 4 个或 5 个空间,您需要添加另一个 AND ... NOT LIKE 。