如何在BigQuery中选择具有所有NULL值的数据列

时间:2017-10-18 21:38:57

标签: sql google-bigquery

如何在BigQuery中选择具有所有NULL值的数据列

A          B          C 
NULL       1           NULL
NULL       NULL        NULL
NULL       2           NULL
NULL       3           NULL

我想要检索A列和C列。请帮助!!

2 个答案:

答案 0 :(得分:4)

扩展我对米哈伊尔答案的评论,这就是我的想法。它不需要生成查询字符串,如果您有大量列,这可能会很长。它将每个列名的空值计数与表中的总行数进行比较,以确定该列是否应包含在结果中。

#standardSQL
WITH `project.dataset.table` AS (
  SELECT NULL A,  1 B,  NULL C  UNION ALL
  SELECT NULL,    NULL, NULL    UNION ALL
  SELECT NULL,    2,    NULL    UNION ALL
  SELECT NULL,    3,    NULL 
)
SELECT null_column
FROM `project.dataset.table` AS t,
  UNNEST(REGEXP_EXTRACT_ALL(
    TO_JSON_STRING(t),
    r'\"([a-zA-Z\_]+)\":null')
  ) AS null_column
GROUP BY null_column
HAVING COUNT(*) = (SELECT COUNT(*) FROM `project.dataset.table`);

答案 1 :(得分:2)

以下是BigQuery StandardSQL

   

简单选项:

#standardSQL
WITH `project.dataset.table` AS (
  SELECT NULL A,  1 B,  NULL C  UNION ALL
  SELECT NULL,    NULL, NULL    UNION ALL
  SELECT NULL,    2,    NULL    UNION ALL
  SELECT NULL,    3,    NULL 
)
SELECT COUNT(A) A, COUNT(B) B, COUNT(C) C
FROM `project.dataset.table`

它返回到下面,其中0(零)表示相应的列具有所有NULL

A   B   C    
0   3   0    

如果这是"不够" - 下面是更多"复杂"版本:

#standardSQL
WITH `project.dataset.table` AS (
  SELECT NULL A,  1 B,  NULL C  UNION ALL
  SELECT NULL,    NULL, NULL    UNION ALL
  SELECT NULL,    2,    NULL    UNION ALL
  SELECT NULL,    3,    NULL 
)
SELECT SPLIT(y, ':')[OFFSET(0)] column
FROM (
  SELECT REGEXP_REPLACE(TO_JSON_STRING(t), r'[{}"]', '') x
  FROM (
    SELECT COUNT(A) A, COUNT(B) B, COUNT(C) C
    FROM `project.dataset.table`
  ) t
), UNNEST(SPLIT(x)) y
WHERE CAST(SPLIT(y, ':')[OFFSET(1)] AS INT64) = 0 

它返回如下结果 - 仅列出具有所有NULL的列

column   
A    
C    

注意:对于您的真实表格 - 只需删除WITH块并将project.dataset.table替换为您的真实表格参考

当然,还要使用真实的列名

  

我的桌子有700个圆柱..

以下是如何轻松为任意数量的列生成上述查询的示例。

<强> 1 即可。刚跑到下面 的 2 即可。复制结果 - 这是生成的查询
<强> 3 即可。将生成的查询粘贴到新UI并运行它 的 4 即可。享受(我希望你会)结果:o)

当然,通常用实际表格引用替换project.dataset.table

#standardSQL
SELECT 
  CONCAT('''
SELECT SPLIT(y, ':')[OFFSET(0)] column
FROM (
  SELECT REGEXP_REPLACE(TO_JSON_STRING(t), r'[{}"]', '') x
  FROM (  
    SELECT ''', y, 
  '''
    FROM `project.dataset.table`
  ) t
), UNNEST(SPLIT(x)) y
WHERE CAST(SPLIT(y, ':')[OFFSET(1)] AS INT64) = 0  
  '''
  )
FROM (
  SELECT 
    STRING_AGG(CONCAT('COUNT(', x, ') ', x), ', ') y
  FROM (
    SELECT REGEXP_EXTRACT_ALL(REGEXP_REPLACE(TO_JSON_STRING(t), r'[{}]', ''), r'"([\w_]+)":') x
    FROM `project.dataset.table` t
    LIMIT 1
  ), UNNEST(x) x
)

注意:请注意查询费用 - &#34;生成查询&#34;最终查询本身将进行全扫描

您可以在table schema

client of your choice生成更便宜的列列表

要测试/玩它 - 你可以在我的回答中使用与初始查询相同的虚拟数据