2017-10-18 44 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

完全同意!更多更酷的例子,像這樣一個將解鎖內置電源供許多用戶使用! –

相關問題