Select 列值,如果该列存在于 table 否则创建该列并在 BigQuery 中将其值设置为 null

Select column value if column exists in that table else create that column and set it's value to null in BigQuery

我想 select 来自 table 的总计 450 个固定列,这些列可能总是有也可能没有全部 450 列。当它没有所有列时,它应该创建缺少的列并将其值设置为 null。 在Sql中有一个函数 如果存在() 但是在bigquery中我无法明智地使用它。

任何建议都会有很大帮助

我在下面假设您有一个 source table(可能“缺失”列的那个)和一个现有的 target table(具有所需的架构)。

为了得到这些table的列的信息,你只需要查看INFORMATION_SCHEMA.COLUMNStable。 下面的解决方案使用动态 SQL,以 1) 生成所需的 SQL,2) 运行 它。

DECLARE column_selection STRING;

SET column_selection = (
    WITH column_table AS (
        SELECT
          source.column_name AS source_colum,
          tgt.column_name AS target_column
        FROM
          (SELECT
              column_name
            FROM `<yourproject>.<target_dataset>.INFORMATION_SCHEMA.COLUMNS`
            WHERE table_name='<target_table>') tgt
        LEFT JOIN
          (SELECT column_name
            FROM `<yourproject>.<source_dataset>.INFORMATION_SCHEMA.COLUMNS`
            WHERE table_name='<source_table>') source
        ON source.column_name = tgt.column_name
    )

    SELECT STRING_AGG(coalesce(source_column,
        CONCAT("NULL AS `",target_column, "`")), ", \n") AS col_selection
  FROM
    column_table
)

EXECUTE IMMEDIATE
  FORMAT("SELECT %s FROM `<yourproject>.<source_dataset>.<source_table>`", column_selection) ;

步骤说明

  1. 为我们要查询的列建一个column_table

    一个。包含目标列的第一列 table, b.第二个包含相应的源列,如果它们存在,或者 NULL 如果它们不存在

  2. 一旦我们有了这个 table,我们就可以构建所需的 SELECT 语句:列的名称在源 table 中,或者如果它不存在,我们希望在查询中包含“NULL AS `column_name_in_target`

这表示在 coalesce(source_column, CONCAT("NULL AS ``",target_column, "\``"))

我们将所有这些语句与 STRING_AGG 聚合到所需的列选择中。

  1. 最后一步:将查询的其余部分放在一起(“SELECT”+ +“FROM ”+ ...),然后我们可以EXECUTE IMMEDIATE吗。