使用带有 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
我是 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