sql - postgresql 两个 NOT LIKE 子句返回错误结果

标签 sql postgresql

我有一个包含 88 个代码的表格。我正在编写一个简单的选择语句,它不选择以 1018

开头的代码
select distinct pcl_mun from exemptions.modiv_parcels_2015 
where (pcl_mun NOT LIKE '10%') or (pcl_mun NOT LIKE '18%')
order by pcl_mun

有人会认为这行得通,但它会返回所有结果

"0233"
"0242"
"1001"
"1002"
"1003"
"1004"
"1005"
"1006"
"1012"
"1013"
"1014"
"1015"
"1018"
"1019"
"1020"
"1024"
"1025"
"1401"
"1402"
"1403"
"1406"
"1407"
"1408"
"1409"
"1412"
"1413"
"1414"
"1415"
"1418"
"1419"
"1420"
"1421"
"1422"
"1423"
"1424"
"1425"
"1426"
"1427"
"1428"
"1429"
"1431"
"1432"
"1433"
"1434"
"1435"
"1436"
"1437"
"1438"
"1439"
"1601"
"1609"
"1611"
"1613"
"1615"
"1801"
"1802"
"1803"
"1807"
"1815"
"1904"
"1906"
"1908"
"1909"
"1911"
"1912"
"1916"
"1918"
"1919"
"1922"
"2101"
"2102"
"2103"
"2105"
"2106"
"2107"
"2108"
"2110"
"2111"
"2112"
"2114"
"2115"
"2116"
"2117"
"2119"
"2120"
"2121"
"2122"
"2123"

如果我单独运行每一个类似的子句,它们都会返回正确的结果。我在这里做错了什么?

最佳答案

当组合 NOT LIKE 时,应使用 AND 而不是 OR

select distinct pcl_mun 
from exemptions.modiv_parcels_2015 
where pcl_mun NOT LIKE '10%' 
  AND pcl_mun NOT LIKE '18%'
order by pcl_mun

这是合乎逻辑的事情,但有时会令人困惑。

简化示例:

('18' NOT LIKE '10%') OR ('18' NOT LIKE '18%')  --> true OR false --> true
('18' NOT LIKE '10%') AND ('18' NOT LIKE '18%')  --> true AND false --> FALSE

('14' NOT LIKE '10%') OR ('14' NOT LIKE '18%')  --> true OR true --> TRUE
('14' NOT LIKE '10%') AND ('14' NOT LIKE '18%')  --> true AND true --> TRUE

因为在否定LIKE的组合时是不同的。
然后应该使用 OR 代替。

NOT ('18' LIKE '10%' OR '18' LIKE '18%')  --> NOT(false OR true) --> FALSE
NOT ('18' LIKE '10%' AND '18' LIKE '18%')  --> NOT(false AND true) --> true

NOT ('14' LIKE '10%' OR '14' LIKE '18%')  --> NOT(false OR false) --> TRUE
NOT ('14' LIKE '10%' AND '14' LIKE '18%')  --> NOT(false AND false) --> TRUE

关于sql - postgresql 两个 NOT LIKE 子句返回错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53103796/

相关文章:

SQL Server 存储过程并在 VB.NET 中执行

sql - 我需要显示来自 json 列表的数据,每个键都作为单独的列

sql - 如何获取 UPSERT 操作的 INSERTED 和 UPDATED 行?

sql - 带有两个参数的 Rails 查询在生产环境中不起作用 : Operator does not exist

sql - PostgreSQL 按单个值过滤组

MySql 删除行并将其添加到另一个表?

php - 上载多个图像并将其路径存储在数据库中

json - 格式 JSON Postgresql

mysql - 使用 JOIN GROUP 和 ORDER BY 优化 MySQL 查询的任何想法

mysql - 连接后获取每个订单 ID 的最新行?