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