根据上一个查询从表中选择列

时间:2019-02-08 19:15:57

标签: google-bigquery

我想利用新的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`

这不起作用,但希望能满足您的需求:我想根据另一个查询的结果从表中选择列。我可以通过多个查询轻松地做到这一点,但是我想将其保存为视图。

1 个答案:

答案 0 :(得分:0)

以下(对于BigQuery Standard 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
相关问题