2017-10-18 82 views

回答

2

下面是大量查询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我的回答中的问题

+0

我的表有700个圆柱..所以这就是我想的 – Pranav

+0

你没有在你的问题中指出这一点:○( - 所以肯定写700个COUNTs是不适用的,但你可以轻松地生成上面脚本与您涉及的所有列:o)尝试! –

+0

可能直接在表的行上使用TO_JSON_STRING,然后使用正则表达式提取具有值的列,对吧?最后一块应该是以某种方式从完整的列列表中减去它:) –

2

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

#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`); 
+0

喜欢这个。嫉妒一点,我错了方向在这里,错过了这一个:o)definitelly投票! BigQuery Standard SQL非常酷的功能! –

+0

谢谢! :)它让我想要在BigQuery中提供更多的反射型功能......它打开了很多很酷的查询模式。 –

+0

完全同意!更多更酷的例子,像这样一个将解锁内置电源供许多用户使用! –

相关问题