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

时间:2017-12-06 20:34:02

标签: 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

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

这就是我目前正在做的事情。我正在为每个人添加一个额外的“和权利!=条款。

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中是否有一种方法只检查列表中不包含值的行,或者我是否必须为每个附加值添加单独的“和权利!= ...”子句?基本上,查询实际上变得非常庞大和复杂,并且我试图找到一种方法来简化它以实现可管理性和可读性。我尝试了方括号,括号,没有等等,但都给了我同样的错误。

2 个答案:

答案 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 |
+---------+-------------+----------+