如何在BigQuery中选择具有所有NULL值的数据列
A B C
NULL 1 NULL
NULL NULL NULL
NULL 2 NULL
NULL 3 NULL
我想要检索A列和C列。请帮助!!
答案 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生成更便宜的列列表要测试/玩它 - 你可以在我的回答中使用与初始查询相同的虚拟数据