如何选择BigQuery中的数据列有所有空值如何在BigQuery中选择数据的列有所有NULL值
A B C
NULL 1 NULL
NULL NULL NULL
NULL 2 NULL
NULL 3 NULL
我想要检索A和C列,请你能帮助! !
如何选择BigQuery中的数据列有所有空值如何在BigQuery中选择数据的列有所有NULL值
A B C
NULL 1 NULL
NULL NULL NULL
NULL 2 NULL
NULL 3 NULL
我想要检索A和C列,请你能帮助! !
下面是大量查询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(零)表示相应的列具有所有空值
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
返回结果如下 - 争取与所有空值仅列
column
A
C
注意:您真表 - 只要删除与拦截和替换project.dataset.table
与真表参考
而且,当然,用真实的列名
我的表有一轮700列..
下面是如何轻松地为任意数量的列生成上述查询的示例。
。刚刚运行
。复制结果 - 这是生成的查询
。粘贴生成的查询到新的用户界面并运行它
。享受(我希望你会)结果:O)
当然,因为通常与你的真实表引用
#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
)
注意更换project.dataset.table
:请注意查询成本 - 无论是“一代查询”和最后查询本身会做全面扫描
您可以生成列列出任何client of your choice
断table schema便宜得多,测试/玩它 - 你可以使用相同的虚拟数据作为最初有q我的回答中的问题
我的表有700个圆柱..所以这就是我想的 – Pranav
你没有在你的问题中指出这一点:○( - 所以肯定写700个COUNTs是不适用的,但你可以轻松地生成上面脚本与您涉及的所有列:o)尝试! –
可能直接在表的行上使用TO_JSON_STRING,然后使用正则表达式提取具有值的列,对吧?最后一块应该是以某种方式从完整的列列表中减去它:) –
扩展我对米哈伊尔答案的评论,这就是我的想法。它不需要生成查询字符串,如果您有大量列,则查询字符串可能会很长。它将每个列名的空值计数与表中的总行数进行比较,以确定列是否应包含在结果中。
#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`);
喜欢这个。嫉妒一点,我错了方向在这里,错过了这一个:o)definitelly投票! BigQuery Standard SQL非常酷的功能! –
谢谢! :)它让我想要在BigQuery中提供更多的反射型功能......它打开了很多很酷的查询模式。 –
完全同意!更多更酷的例子,像这样一个将解锁内置电源供许多用户使用! –
你正在使用哪个数据库? – indiri
显然BigQuery,因为标题 –