带有多行子查询的Postgres CASE

问题描述

我需要从具有全名的列中查询名字(子字符串)。为了收集统计信息,我需要在这个拳头名称有多个时分开,然后,我需要查询一个名字。

像这样:

SELECT 
    CASE
        WHEN (SELECT
            count(substring(nome,position(' ' in nome))) as quantidade
            FROM usuarios
            GROUP BY substring(nome,position(' ' in nome))
        ) > 1
         THEN substring(t.nome,position(' ' in t.nome))||' '||split_part(t.nome,' ',2)
        ELSE substring(t.nome,position(' ' in t.nome))
 END AS "Colaborador",

但是我可以这样做,因为我的结果是

查询返回的一行以上

但是是的,它将返回多个行

我不知道该怎么做。

在此先感谢您的帮助

解决方法

使用窗口功能:

SELECT CASE WHEN cnt = 1
            THEN split_part(nome,' ',1)
            ELSE split_part(nome,1) || ' ' || split_part(nome,2)
       END
FROM (SELECT t.nome,count(*) OVER (PARTITION BY split_part(t.nome,1)) AS cnt
      FROM atable) AS subq;