首页 > 解决方案 > 根据先前的查询从表中选择列

问题描述

我想利用新的INFORMATION_SCHEMA元数据表动态地构建查询,类似于进行反射。我想要做的是过滤掉与列描述中的某个关键字匹配的列。

这是我正在尝试做的事情:

WITH
  nonconfidential_mytable_columns AS (
  SELECT
    column_name
  FROM
    `mydataset.INFORMATION_SCHEMA.COLUMN_FIELD_PATHS`
  WHERE
    table_name = "mytable"
    AND description NOT LIKE "%CONFIDENTIAL%")
SELECT
  (
  SELECT
    *
  FROM
    nonconfidential_mytable_columns)
FROM
  `mydataset.mytable`

这不起作用,但希望能得到满足:我想根据另一个查询的结果从表中选择列。我可以通过多个查询轻松完成此操作,但我想将其保存为视图。

标签: google-bigquery

解决方案


下面(对于 BigQuery 标准 SQL)是我遇到的最接近您的案例

#standardSQL
WITH nonconfidential_mytable_columns AS (
    SELECT ARRAY_AGG(column_name) cols
    FROM `mydataset.INFORMATION_SCHEMA.COLUMN_FIELD_PATHS`
    WHERE table_name = 'mytable'
    AND description NOT LIKE "%CONFIDENTIAL%"
)
SELECT 
    IF('col1' IN UNNEST(cols), col1, NULL) col1,
    IF('col2' IN UNNEST(cols), col2, NULL) col2,
    IF('col3' IN UNNEST(cols), col3, NULL) col3
FROM `mydataset.mytable`, nonconfidential_mytable_columns   

我认为,它已经足够接近了——但仍然不完全是你的“要求”——因为仍然暴露了所有列名,但“机密”列的值现在都是 NULL。而且 - 您需要明确列出所有列与使用*

无论如何-现在您可以将上面另存为视图,但重要的是不要将其保存在与用户相同的数据集中,mydataset而是将其保存在users_dataset用户可以免费使用的数据集中(比方说),然后mydataset通过以下方式与视图共享Authorized View选项


推荐阅读