无法弄清楚如何在ORDER BY子句中正确使用CASE WHEN语句

时间:2019-05-24 19:48:44

标签: sql runtime-error pgadmin

我在pgadmin查询工具上收到一条错误消息,说不存在deelnemers(这是荷兰数据库)。但是据我了解的sql查询,SELECT应该在ORDER BY之前执行。

我已经尝试过更改CASE WHEN语句的顺序,但是我一直收到此错误。

SELECT r.reisnr , COUNT (k.naam) AS deelnemers
FROM ruimtereizen.reizen r
INNER JOIN ruimtereizen.deelnames d
USING (reisnr)
INNER JOIN ruimtereizen.klanten k
USING (klantnr)
GROUP BY r.reisnr
ORDER BY CASE WHEN COUNT (DISTINCT deelnemers) > 1 THEN deelnemers
WHEN COUNT (DISTINCT deelnemers) = 1 THEN r.reisnr
ELSE deelnemers
END

错误是deelnemers不存在。

2 个答案:

答案 0 :(得分:1)

作为一般性回答,我会说您的“通用SQL”是好的。但是...每个数据库都支持某些功能,而不能支持其他功能。

无论如何,为了安全起见,我会在CTE中预先计算您的COUNT()函数,以便可以在外部查询中自由使用它。例如:

with
x as (
  SELECT 
    r.reisnr, 
    COUNT (k.naam) AS deelnemers,
    COUNT (DISTINCT deelnemers) as dd
  FROM ruimtereizen.reizen r
  INNER JOIN ruimtereizen.deelnames d
  USING (reisnr)
  INNER JOIN ruimtereizen.klanten k
  USING (klantnr)
  GROUP BY r.reisnr
)
select * 
from x
ORDER BY CASE WHEN dd > 1 THEN deelnemers
              WHEN dd = 1 THEN reisnr
              ELSE deelnemers
              END

答案 1 :(得分:0)

CASEORDER BY一起使用很简单。该表达式只需要有效即可。

我只能想象你想做什么。如果要先按deelnemers然后按名称订购,则不需要CASE

order by deelnemeers desc, reisnr