如何以简化格式输出 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 数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何以人类可读的格式输出(到日志)多级数组?

如何以输出生成“创建表语句”的方式格式化 Oracle SQL 查询?

如何使用 PL SQL 输出这种 XML 格式

PHP如何将SQL查询结果转为多维数组,并按查询行输出

jsp 中如何将sql查询结果以数组形式显示出来

根据 SQL 中的 id 将 JSON 格式化为嵌套数组