我在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
等
如何编写查询以便检查权利值是否不在值列表中?
这就是我目前正在做的事情。我正在为每个人添加一个额外的“和权利!=条款。
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
我尝试了以下操作:
SELECT *
FROM events
WHERE entitlement is not in ['labp', 'lpaf']
order by logtime desc
LIMIT 1000
但是我收到以下错误:
查询失败 错误:在第3行第33栏遇到“”。
BigQuery中是否有一种方法只检查列表中不包含值的行,或者我是否必须为每个附加值添加单独的“和权利!= ...”子句?基本上,查询实际上变得非常庞大和复杂,并且我试图找到一种方法来简化它以实现可管理性和可读性。我尝试了方括号,括号,没有等等,但都给了我同样的错误。
答案 0 :(得分:1)
以下是BigQuery Standard SQL
#standardSQL
WITH events AS (
SELECT 'alice' AS name, 'laxy' AS entitlement, '01072017' AS DATE UNION ALL
SELECT 'bob', NULL, '01082018' UNION ALL
SELECT 'mike', '', '01082018' UNION ALL
SELECT 'charlie', 'lapb', '01092017' UNION ALL
SELECT 'dan', 'n/a', '01082018' UNION ALL
SELECT 'daniel', 'lacf', '01092017'
), known_entitlements AS (
SELECT entitlement
FROM UNNEST(['laxy','lapb','lacf']) entitlement
)
SELECT e.*
FROM events e
LEFT JOIN known_entitlements k
ON e.entitlement = k.entitlement
WHERE k.entitlement IS NULL
您可以将所有已知权利添加到known_entitlements
中,也可以将所有权利全部放在单独的表格中
结果是
name entitlement date
bob null 01082018
mike 01082018
dan n/a 01082018
答案 1 :(得分:0)
#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 |
+---------+-------------+----------+