使用带有 BigQuery 中任何可能内容的字符串进行过滤

Filter using string with any possible content in BigQuery

我是 BigQuery 的新手。

我正在构建一个查询,我将与其他几个人共享。每个人负责不同的业务部门,我希望他们能够轻松地在此查询中插入其业务部门的名称。

我构建了这样的东西,根据我的测试它运行良好:

DECLARE business_units array<string>;

SET business_units = ["unit_A", "unit_C", "unit_D"];
    
SELECT *
FROM dataset
WHERE bu_name IN UNNEST(business_units)

问题

我还希望能够轻松更改该查询以搜索所有可能的业务部门。

理想情况下,我只想更改“SET”行。我尝试了不同的方法,但其中 none 似乎有效。我相信我需要使用元字符或正则表达式,但我找不到正确的组合。我已经查看了 BigQuery 文档,但我无法理解如何执行此操作。

我试过类似的东西:

SET business_units = ["."];
SET business_units = ["*"];
SET business_units = ["\."];
SET business_units = ["%%"];

当我使用其中任何一个时,我的结果 return 为空。

有人能给我指出正确的方向吗?

IN不能使用LIKE或正则表达式处理列表,LIKE或正则表达式不能将数组作为参数。

直接的方法是在非嵌套列表上使用 JOIN

DECLARE business_units array<string>;

SET business_units = ["unit_A", "unit_C", "unit_D"];
    
SELECT
  *
FROM
  dataset
INNER JOIN
  UNNEST(business_units)  AS param_pattern
    ON dataset.buname LIKE param_pattern

如果一行与数组中的多个元素匹配,则会出现重复(每个数据集行与它匹配的每个模式相连接)。

如何处理取决于您。您可能只有 SELECT DISTINCT dataset.*,但您的问题并未涵盖这一点。 (如果您不确定如何继续,请在完成此部分后打开另一个问题。)

这里有很多选项供您选择。我将向您展示那些对您的原始解决方案进行了最小更改的解决方案

选项 #1

DECLARE business_units array<string>;

SET business_units = ["unit_A", "unit_C", "unit_D", "ALL_UNITS"]; 

SELECT *
FROM dataset
WHERE bu_name IN UNNEST(business_units)
OR "ALL_UNITS" IN UNNEST(business_units);   

正如您在此处看到的那样 - 当您需要所有单位时 - 在您的 SET 行中添加“ALL_UNITS”

选项 #2

DECLARE business_units array<string>;
DECLARE all_units boolean;

SET business_units = ["unit_A", "unit_C", "unit_D"]; 
SET all_units = TRUE;

SELECT *
FROM dataset
WHERE bu_name IN UNNEST(business_units)
OR all_units;     

此处 - 您还有一个参数 all_units。当您想查看所有单位时 - 只需将其设置为 TRUE,否则设置为 FALSE