sql - WHERE colname LIKE '% %' OR colname LIKE '% % %' 返回包含四个单词的行
问题描述
以下代码应该返回城市名称为两个或三个单词的行,但它也返回一个包含四个单词的行:
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 '% % % %'
为什么会这样?
解决方案
其他答案已经解释了为什么你得到你的答案——带有 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 或完整的正则表达式选项,它们甚至可以比上面的更好。
推荐阅读
- .net - 如何手动设置为未经授权并重定向到自定义页面?
- php - nginx 不使用 VSCode 远程容器扩展(docker compose)打开 localhost
- flutter - 从另一个屏幕移回屏幕后颤动调用一个函数
- jquery - 我想通过jquery获取按钮旁边输入框的值
- python - 旧版 chrome(v48),是否有适合旧版 chrome 的 chromedriver?
- python - 需要在烧瓶 restplus 中发送响应后 2 小时后执行方法
- javascript - 使用 react redux 和 firebase 按值过滤表
- json - 在 NIFI 中将 Json 拆分为多个 json
- vb.net - 未给定值 对于一个或多个必需参数 (dataadapter.fill(dt))
- r - R data.table:在一个语句中将data.table的条件摘要合并回原始data.table