我正在使用 BigQuery,无法理解为什么这两个查询不返回相同的行。
我想过滤其中包含“test”、“TEST”或“Test”一词的所有行。
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
。