如何以简化格式输出 SQL 数组?
Posted
技术标签:
【中文标题】如何以简化格式输出 SQL 数组?【英文标题】:How to output SQL arrays in simplified format? 【发布时间】:2020-07-17 01:19:45 【问题描述】:在 BigQuery 上使用标准 SQL,我将多个电子邮件列组合成一组独特的电子邮件。
输出(通过 Excel 上的 PowerQuery 查询)显示为
"v":["v":"joe@fakemail.com","v":"joe.bro@someemail.com"]
我第一次看到这个。
这看起来像一个键值对象,其中一个数组作为值,然后每个数组值又是一个键值对象。这是正常输出吗? (我在下面粘贴相关代码sn-p)。
如何输出 [joe@fakemail.com , joe.bro@someemail.com] 或 ["joe@fakemail.com" , "joe.bro@someemail.com"]。
以下是导致此输出的一段 SQL:
WITH emails AS (
select 'Joe' as name, 'joe@hotmail.com,joe@someemail.com' as email1, 'joe@hotmail.com' as email2
UNION ALL
select 'Brenda', 'brenda@mail.com', 'Brenda81@TEST.com'
)
select name,
ARRAY(
SELECT DISTINCT REPLACE(TRIM(LOWER(EMAIL))," ","") from UNNEST(
ARRAY_CONCAT(
SPLIT(email1, ","),
SPLIT(email2, ",")
)
) AS EMAIL WHERE EMAIL like '%@%'
) AS UNIQUE_EMAILS,
FROM emails
【问题讨论】:
请看How to create a Minimal, Reproducible Example @MikhailBerlyant 你指的是我的代码 sn-p? 是的。我想在你的问题中回答 #2 这会有所帮助 好的。这是你的建议吗? 您好,请参考official documentation,它描述了访问ARRAY 元素。让我知道结果。 【参考方案1】:改用下面不那么冗长的版本(也用更少的字符串到数组到字符串来回 - 所以应该更好地执行)
select name,
(select string_agg(distinct lower(email))
from unnest(split(concat(email1, ',', email2))) email
) unique_emails
from emails
如果应用于您问题的样本数据 - 输出是
【讨论】:
【参考方案2】:解决方案是使用ARRAY_TO_STRING()
将数组转换为字符串。
WITH emails AS (
select 'Joe' as name, 'joe@hotmail.com,joe@someemail.com' as email1, 'joe@hotmail.com' as email2
UNION ALL
select 'Brenda', 'brenda@mail.com', 'Brenda81@TEST.com'
)
select name,
ARRAY_TO_STRING(
ARRAY(
SELECT DISTINCT REPLACE(TRIM(LOWER(EMAIL))," ","") from UNNEST(
ARRAY_CONCAT(
SPLIT(email1, ","),
SPLIT(email2, ",")
)
) AS EMAIL WHERE EMAIL like '%@%'
),
','
) AS UNIQUE_EMAILS,
FROM emails
【讨论】:
以上是关于如何以简化格式输出 SQL 数组?的主要内容,如果未能解决你的问题,请参考以下文章