为什么 SQL WHERE 子句 NOT with OR 与 NOT IN 的过滤结果不同 [关闭]

问题描述 投票:0回答:2

我想过滤掉包含“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%')`

为什么结果不同?

sql google-bigquery subquery where-clause
2个回答
0
投票

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
)

-1
投票

第一个查询不正确,因为

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

© www.soinside.com 2019 - 2024. All rights reserved.