【问题标题】:BigQuery check for array overlapBigQuery 检查数组重叠
【发布时间】:2017-08-04 02:50:00
【问题描述】:

所以我正在编写一个 BigQuery 查询,基本上只需要能够检查是否有任何字符串作为元素存在于表的一个列中,其中关心的列本身包含数组字符串。就上下文而言,我正在编写查询作为一个小的自动化 Python 作业的一部分,并且使用标准 SQL。

我在这里找不到任何可以明确检查数组包含的内容:https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators

所以我想出了一个使用非常老套的正则表达式的解决方案,具体来说:

...other query stuff...

WHERE
    REGEXP_CONTAINS((LOWER(ARRAY_TO_STRING(column, '-'))), r"({joined_string})")

...其中column 是我在表中关心的列,joined_string 是一个长字符串,由我需要检查的所有字符串组成,并由| 连接(其中| 用作正则表达式 OR 运算符)。

BigQuery 标准 SQL 中是否存在某种内置功能,可以让人们更明智地执行此操作?

【问题讨论】:

  • 请澄清 - column 是重复的字符串字段吗?
  • @MikhailBerlyant 是的,如果不清楚,抱歉。
  • 我已经猜到了 :o) - 请参阅下面的答案

标签: python google-bigquery google-cloud-platform bigquery-standard-sql


【解决方案1】:

以下是两个示例。

首先假设您的字符串在另一个表中strings

#standardSQL
WITH yourTable AS (
  SELECT 1 AS id, ['abc', 'def', 'xyz'] AS column UNION ALL
  SELECT 2, ['123', '456', '789'] UNION ALL
  SELECT 3, ['135', '246', '369'] 
),
strings AS (
  SELECT 'abc' AS str UNION ALL
  SELECT '123' UNION ALL
  SELECT '456'
)
SELECT *
FROM yourTable
WHERE (SELECT COUNT(1) FROM UNNEST(column) AS col JOIN strings ON col = str) > 0  

如果您需要查看有多少字符串匹配,您可以将下面添加到SELECT 列表中

(SELECT COUNT(1) FROM UNNEST(column) AS col JOIN strings ON col = str) AS cnt

第二个例子假设你有一个包含在数组中的字符串列表

#standardSQL
WITH yourTable AS (
  SELECT 1 AS id, ['abc', 'def', 'xyz'] AS column UNION ALL
  SELECT 2, ['123', '456', '789'] UNION ALL
  SELECT 3, ['135', '246', '369'] 
),
strings AS (
  SELECT ['abc', 'def', '456'] AS strs
)
SELECT yourTable.*
FROM yourTable, strings
WHERE (SELECT COUNT(1) FROM UNNEST(column) AS col JOIN UNNEST(strs) AS str ON col = str) > 0   

与第一个示例相同 - 您可以将下面添加到 SELECT 列表以查看匹配计数

(SELECT COUNT(1) FROM UNNEST(column) AS col JOIN UNNEST(strs) AS str ON col = str) AS cnt

【讨论】:

  • 谢谢!看起来这样可以解决问题 - 我的 strings 实际上只是一个数组,我正在从 Python 中将其格式化为查询的文本,但我认为第二种方法仍然有效。似乎 BigQuery 会为此提供一些专用功能,但我想没有这样的运气。
  • @HuntervanA。 - 重要的是,您可以使用已发布答案左侧、投票下方的勾号来标记已接受的答案。请参阅meta.stackexchange.com/questions/5234/… 了解为什么它很重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多