2015-04-26 5 views
3

, когда я использую заявление как Условие случая оно всегда возвращает false;PostgreSql: используя заявление как условие условия

select * from table order by (case when (true) then id else 1/0 end) desc -- works 
select * from table order by (case when (select true) then id else 1/0 end) desc -- exception 
select * from table order by (case when (1=1) then id else 1/0 end) desc -- works 
select * from table order by (case when (select 1=1) then id else 1/0 end) desc -- exception 

Что не так с этим условием?

ответ

1

CASE WHEN ожидает boolean результата из условия согласно documentation:

Каждого условия этим выражения, которое возвращает логический результат.

В SELECT заявления возвращают отношение (да, с одной строки, имеющей один столбец с boolean типа и значение TRUE, но это по-прежнему не boolean).

+0

ok, есть ли способ конвертировать это повторение в boolean! Я попытался преобразовать его с помощью *** :: boolean *** оператора. он не работает. – idemirel

+0

Да, оператор select возвращает отношение, но единственное возвращаемое значение из [скалярного подзапроса '(select ...)'] (http://www.postgresql.org/docs/current/static/sql-expressions.html # SQL-SYNTAX-SCALAR-SUBQUERIES) используется в выражении. –

1

подзапрос (select true) возвращает логическое значение:

select (select true); 
bool 
------ 
t 

И в case работы:

select (case when (select true) then 1 else 0 end); 
case 
------ 
    1 

Проблема заключается в том, что выражение else всегда оценивается:

select (case when (select true) then 1 else 1/0 end); 
ERROR: division by zero 

В вместо этого разделите условие в целое:

select 1/true::integer; 
?column? 
---------- 
     1 

select 1/false::integer; 
ERROR: division by zero 

Ваш пример кода будет:

select * 
from table 
order by id/(my_condition)::integer desc 

BTW вы уверены, что вы хотите поднять исключение?

+0

"* выражение else всегда оценивается *" [противоречит руководству] (http://www.postgresql.org/docs/current/static/functions-conditional.html#FUNCTIONS-CASE): "* Если условие результат равен true, значение выражения CASE является результатом, который следует за условием **, и остаток выражения CASE не обрабатывается *** « –

+0

@a_horse_with_no_name Когда условие включает в себя подзапрос, который не является истинным, как показано в мой пример. –

+0

@a_horse_with_no_name Эта формулировка не ясна. Что представляет собой остаток выражения CASE? Другие условия «когда»? –

Смежные вопросы