【问题标题】:Sort conditional data in Postgres STRING_AGG在 Postgres STRING_AGG 中对条件数据进行排序
【发布时间】:2018-04-15 14:07:09
【问题描述】:

我提出了一个查询,用于在 Postgress 中使用 STRING_AGG 的条件语句创建连接字符串。这工作得很好,但我也想对结果进行排序而不重复 CASE

这就是我现在拥有的:

SELECT
STRING_AGG(distinct name, ', ' ORDER BY name),
STRING_AGG(
  DISTINCT
  CASE WHEN something = true THEN 'type1'
       WHEN something_else = true THEN 'type2'
       ELSE 'type3'
  END, ', '
ORDER BY
  CASE WHEN something = true THEN 'type1'
       WHEN something_else = true THEN 'type2'
       ELSE 'type3'
  END

)
from organisations

..但是我想做这样的事情来避免重复的代码并从我的查询中删除行和复杂性,但我不知道如何使它工作,这是明显不起作用的假代码,但你明白了:

SELECT
STRING_AGG(distinct name, ', ' ORDER BY name) names,
STRING_AGG(
  DISTINCT (
    CASE WHEN something = true THEN 'type1'
         WHEN something_else = true THEN 'type2'
         ELSE 'type3'
    END
  ) as types, ', ' ORDER BY types) types
from organisations

【问题讨论】:

    标签: sql postgresql string-aggregation


    【解决方案1】:

    您不需要string_agg()。你可以这样做:

    SELECT STRING_AGG(distinct name, ', ' ORDER BY name) names,
           CONCAT_WS(',',
                     (CASE WHEN SUM( (something = true)::int ) > 0 THEN 'type1'),
                     (CASE WHEN SUM( (not (something = true) )::int ) > 0 THEN 'type2')
                    ) as types
    FROM organisations o;
    

    您可能过度简化了查询,但对于您提供的内容,第二部分不需要string_agg(distinct)

    【讨论】:

    • 太好了,我可以让你的建议对我有用,我自己也想不出来。谢谢!
    【解决方案2】:

    一种选择可能是首先在单独的 CTE 中计算 CASE 表达式,然后查询该 CTE 以应用 STRING_AGG

    WITH cte AS (
        SELECT
            name,
            CASE WHEN something = true THEN 'type1'
                 WHEN something_else = true THEN 'type2'
                 ELSE 'type2'
            END AS expr
        FROM organisations
    )
    
    SELECT
        STRING_AGG(distinct name, ', ' ORDER BY name),
        STRING_AGG(DISTINCT expr, ', ' ORDER BY expr)
    FROM cte;
    

    作为一个小注解,由于 type2CASE 表达式中同时作为第二个条件和 ELSE 条件,所以您不妨只使用这个:

    CASE WHEN something = true THEN 'type1'
         ELSE 'type2'
    END
    

    【讨论】:

    • 其实ELSE中的type2是一个错字,谢谢指出,我没有更正。
    猜你喜欢
    • 2014-09-14
    • 2013-09-30
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多