是否可以列出 BigQuery 中没有数据的所有列

Is it possible to list all columns without data in BigQuery

我在工作中使用 BigQuery,并且正在进行一些数据验证。作为其中的一部分,我试图找到给定 table 中完全由 null 值组成的所有列。我知道我可以使用类似

的方式单独查询每一列
SELECT count(id), <column_name> FROM <dataset>.<table>
WHERE <column_name> IS NOT NULL
GROUP EACH BY 2 HAVING count(id) = 0

我宁愿不必对 table 中的每一列都执行此操作,因为它们的数量很多。

这可以在没有 运行 每列查询的情况下完成,如下所示。在 SELECT 中取 SUM 个非空值,并查找包含零个非空值的列。

SELECT
  SUM(column_1 IS NOT NULL),
  SUM(column_2 IS NOT NULL),
  SUM(column_3 IS NOT NULL)
FROM
  (SELECT NULL AS column_1, NULL AS column_2, 17 AS column_3),
  (SELECT 18 AS column_1, NULL AS column_2, 19 AS column_3)

在这种情况下,结果是:

| column_1 | column_2 | column_3 |
|----------|----------|----------|
|        1 |        0 |        2 |

这告诉我们 column_2 只包含空值。

要添加到上述答案中,

以上答案仅适用于整数列,如果有其他类型的列,您可以执行以下操作

SELECT SUM(如果(第 1 列为 NULL, 0, 1)), SUM(IF(column2 为 NULL, 0, 1)) 从 table

在这种情况下,无论数据类型如何,所有空值都被视为 0,其他值被视为 1。如果结果为 0,则该列包含的所有值都为空。

SELECT
    column_name, COUNT(1) AS nulls_count
FROM
    `projectID.Dataset.Table`,
    UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(`projectID.Dataset.Table`), r'"(\w+)":null')) column_name
GROUP BY
    column_name
ORDER BY
    nulls_count DESC

上面的bigquery给出了具有NULL值的记录数并对列进行分组。另请注意,查询不会给出非空列。