我试图从3个匹配TABLE_SUFFIX模式的表中选择*行,问题是我没有收到预期的输出。
我使用的查询:
SELECT
*
FROM
`project-id.airbyte_google_ads.client_id_*`
WHERE
REGEXP_CONTAINS(_TABLE_SUFFIX, r"_campaign_performance_overview$")输出接收包含其他表的列,而不是来自我想要的表,但如果我使用的是:
SELECT
DISTINCT _TABLE_SUFFIX as tables
FROM
`project-id.airbyte_google_ads.client_id_*`
WHERE
REGEXP_CONTAINS(_TABLE_SUFFIX, r"_campaign_performance_overview$")要从中选择行的表名是正确的。
我的看法是,通配符行有问题,如果有什么方法可以使用它,比如:
`project-id.airbyte_google_ads.client_id_*_campaign`或者类似的东西,因为看起来像查询在FROM语句上做了一些事情,并且在不同的地方做了一些事情。
告诉我你对这件事的看法是什么。谢谢您抽时间见我!
发布于 2022-04-11 14:42:08
根据此文档,在使用通配符表时,即使将_TABLE_SUFFIX与REGEXP_CONTAINS结合使用,数据集中以表名*开头的所有表也会被扫描。在我们的例子中,通配符模式是client_id_*,因此,与REGEXP_CONTAINS中的模式无关,client_id_1_campaigns之类的值也是匹配的。
造成这种行为的原因是,通配符模式先于正则表达式并扫描所有匹配通配符模式的表,并且不会考虑正则表达式。使用通配符同时也使用REGEXP_CONTAINS是在regex之上应用regex,不建议这样做。
如果希望有预期的目标表,则需要使用下面的查询,而不是使用通配符来查询多个表。
SELECT *
FROM (
SELECT * FROM `project-id.dataset-id.client_id_2_campaign_performance_overview` UNION ALL
SELECT * FROM `project-id.dataset-id.client_id_7_campaign_performance_overview` UNION ALL
SELECT * FROM `project-id.dataset-id.client_id_10_campaign_performance_overview`);由于上述同样的原因,使用LIKE运算符也不会给出预期的结果。首先扫描这些表,然后对其进行过滤,在结果中提供额外的列。
此外,BigQuery使用最近创建的表的架构,该表与通配符匹配为通配符表的架构。即使使用WHERE子句中的_TABLE_SUFFIX伪列限制要从通配符表中使用的表数,BigQuery也对最近创建的与通配符匹配的表使用架构。如果最近创建的表中有额外的列,您将在结果中看到它们。
https://stackoverflow.com/questions/71705354
复制相似问题