为什么使用 SQL WHERE 子句、NOT 和 NOT IN 过滤的结果如此不同[关闭]

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

我正在使用 BigQuery,无法理解为什么这两个查询不返回相同的行。

我想过滤其中包含“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.