如何使用 BigQuery 旧版 sql 查询相同的重复字符串字段以获取多个值?

Posted

技术标签:

【中文标题】如何使用 BigQuery 旧版 sql 查询相同的重复字符串字段以获取多个值?【英文标题】:How to query same repeated string field for multiple values with BigQuery legacy sql? 【发布时间】:2020-01-20 15:43:48 【问题描述】:

我有一个结构为 t1 的表:

id:整数 名称:重复(字符串)

我有多个名称的条目:

123;姓名1,姓名2 124;姓名1,姓名3,姓名4,姓名5 125;姓名1,姓名4,姓名7

我想返回 name 等于 name1name4 的行(唯一),这将返回第 2 行和第 3 行,id 124 和125

Bigquery 会自动展平结果。但这很难返回包含多个的行

由于某些限制,必须使用 LegacySQL 执行此操作。我试过了:

SELECT _id AS _id, GROUP_CONCAT_UNQUOTED(name) AS name where name 像“%name1%”和像“%name4%”这样的名字

用 = 也试过了,但不工作。

由于name1,这也返回所有行:

名称输入 ("name1", "name4")

(name = "name1" or name = "name4")

【问题讨论】:

【参考方案1】:

由于某些限制,必须使用 LegacySQL 执行此操作

以下是 BigQuery 旧版 SQL

选项#1

#legacySQL
SELECT id, NEST(name) name
FROM [project:dataset.table] 
GROUP BY id
HAVING SUM(name IN ('name1', 'name4')) = 2

并将没有展平结果的目标表设置为 false(在 UI 中未选中)

选项 #2

#legacySQL
SELECT id, GROUP_CONCAT(name) name
FROM [project:dataset.table] 
GROUP BY id
HAVING SUM(name IN ('name1', 'name4')) = 2

结果(假设该表已从您的问题中抽取数据)

Row id  name     
1   124 name1,name3,name4,name5  
2   125 name1,name4,name7    

注意:以上选项假定名称数组中没有重复的名称,这看起来很可能是您的情况

选项 #3 - 这实际上适用于 BigQuery 标准 SQL - 假设您可以将您的内容迁移到标准 SQL

#standardSQL
SELECT id, name
FROM `project.dataset.table`
WHERE 2 = (SELECT COUNT(DISTINCT item) FROM UNNEST(name) item WHERE item IN ('name1','name4'))

结果

Row id  name     
1   124 name1    
        name3    
        name4    
        name5    
2   125 name1    
        name4    
        name7    

【讨论】:

以上是关于如何使用 BigQuery 旧版 sql 查询相同的重复字符串字段以获取多个值?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 BigQuery 的 API 使用标准 SQL 进行查询?

在 BigQuery 中使用 dryRun 区分标准和旧版 SQL 查询的替代方法?

如何更改 BigQuery 控制台(Web UI)中的默认选项,尤其是取消选中“使用旧版 SQL”?

Big Query - 使用旧版和普通 sql 时的用户数量不同

标准 sql 中的 bigquery 旧版 sql POSITION() 函数

Python gcloud BigQuery 中的 run_async_query 使用标准 SQL 而不是旧版 SQL