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