Не могу понять, как правильно использовать оператор CASE WHEN в предложении ORDER BY - PullRequest
0 голосов
/ 24 мая 2019

Я получаю сообщение об ошибке в инструменте запроса 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 ]

1 голос
/ 24 мая 2019

В качестве общего ответа я бы сказал, что ваш "универсальный SQL" хорош. Но ... каждая база данных поддерживает некоторые функции и не поддерживает другие.

В любом случае, чтобы быть в безопасности, я бы предварительно вычислил вашу функцию COUNT() в CTE, чтобы я мог свободно использовать ее во внешнем запросе. Например:

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
0 голосов
/ 24 мая 2019

Использование CASE с ORDER BY просто. Выражение просто должно быть действительным.

Я могу только представить, что ты хочешь сделать. Если вы хотите заказать сначала по deelnemers, а затем по имени, вам не нужно CASE:

order by deelnemeers desc, reisnr
...