我有一个包含 88 个代码的表格。我正在编写一个简单的选择语句,它不选择以 10
或 18
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/