如何向 BigQuery 查询添加 WHERE 子句以查找列值不在值列表中的行

Jos*_*hak 7 google-bigquery

我在 BigQuery 中有一个名为 events 的表,其中有一列名为“entitlement”。该列可以具有“lapb”、“lacf”、“lasg”、“laxy”、“laza”等值。它也可以具有“null”或“”或其他我不知道的值。它每行只有 1 个给定值,因此它不是值列表。例如,这里是一些示例数据:

name    entitlement date
alice   laxy        01072017
bob     null        01082018
charlie lapb        01092017
daniel  lacf        01092017
Run Code Online (Sandbox Code Playgroud)

ETC

如何编写查询以便检查权利值是否不在值列表中?

这就是我目前正在做的。我为每一个添加了一个额外的“和权利!=”子句。

SELECT *
FROM events 
WHERE entitlement != 'lapb' and entitlement != 'lacf' 
and entitlement != 'lasg' and entitlement != 'laxy' 
and entitlement != 'laza' and entitlement is not null
order by logtime desc
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)

我尝试执行以下操作:

SELECT *
FROM events 
WHERE entitlement is not in ['labp', 'lpaf']
order by logtime desc
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

查询失败错误:在第 3 行第 33 列遇到“”。

BigQuery 中是否有一种方法可以仅检查列表中不包含值的行,或者我必须为每个附加值添加单独的“and entitlement != ...”子句?基本上,查询确实很快变得庞大且复杂,我试图找到一种方法来简化它,以实现可管理性和可读性。我尝试了方括号、括号、什么都没有等等,但都给了我同样的错误。

Ell*_*ard 5

#standardSQL
WITH events AS (
  SELECT 'alice' AS name, 'laxy' AS entitlement, '01072017' AS date UNION ALL
  SELECT 'bob', NULL, '01082018' UNION ALL
  SELECT 'charlie', 'lapb', '01092017' UNION ALL
  SELECT 'daniel', 'lacf', '01092017'
)
SELECT *
FROM events
WHERE entitlement NOT IN ('labp', 'lpaf');
+---------+-------------+----------+
| name    | entitlement | date     |
+---------+-------------+----------+
| alice   | laxy        | 01072017 |
| charlie | lapb        | 01092017 |
| daniel  | lacf        | 01092017 |
+---------+-------------+----------+
Run Code Online (Sandbox Code Playgroud)