我想过滤掉包含“test”、“TEST”或“Test”的行。
大约 6,000 行符合此条件。因此,我的查询应返回的行数是总行数减去 6,000。
第一个查询差异约为 2,463,051,所以我犯了一个错误。
第二个查询过滤掉 6,000 行。
SELECT
*
FROM
rides
WHERE
NOT (start_station_name LIKE '%test%' OR
start_station_name LIKE '%Test%' OR
start_station_name LIKE '%TEST%')`
SELECT
*
FROM
rides
WHERE
ride_id NOT IN (SELECT ride_id
FROM rides
WHERE start_station_name LIKE '%test%' OR
start_station_name LIKE '%Test%' OR
start_station_name LIKE '%TEST%')`
为什么结果不同?
LIKE
将跳过空值。要在 start_station_name
列中包含包含 null 的行,请使用:
SELECT *
FROM rides
WHERE start_station_name IS NULL
OR NOT (
start_station_name LIKE '%test%' OR
start_station_name LIKE '%Test%' OR -- this is optional
start_station_name LIKE '%TEST%' -- unless the column is case sensitive
)
第一个查询不正确,因为
NOT
运算符应该应用于单个条件,而不是一组条件。
要使用
NOT
运算符,您应该说明每个条件,例如:
SELECT
*
FROM
rides
WHERE
NOT (start_station_name LIKE '%test%')
AND NOT (start_station_name LIKE '%Test%')
AND NOT (start_station_name LIKE '%TEST%')
请记住,执行
NOT IN (element1,element2)
很好,因为它是一个条件而不是列表,但是,不可能同时使用 LIKE
和 IN
。