对 Postgres STRING_AGG 中的条件数据进行排序



我想出了一个查询,使用 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

你不需要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)

一种选择可能是首先在单独的 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;

作为次要的旁注,由于您在CASE表达式中将type2作为第二个条件和ELSE条件,因此您不妨只使用它:

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

最新更新