Во-первых: я выполняю postgresql 8.2 и тестирую мои запросы на pgAdmin.
Я имею таблицу с некоторыми полями, говорю:
mytable(
id integer,
mycheck boolean,
someText varchar(200));
Теперь, я хочу запрос similary к этому:
select id,
case when mycheck then (select name from tableA)
else (select name from tableB) end as mySpecialName,
someText;
Я пытался выполнить и получить это:
ERROR: CASE types character varying and boolean cannot be matched
SQL state: 42804
И даже пытаясь одурачить postgresql с
case (mycheck::integer) when 0 then
не работал.
Так, мой вопрос: так как sql не имеет, если, только случай, как я, предполагает, чтобы сделать если с булевым полем?
Ваша проблема заключается в несоответствии ваших значений (выражения после , затем
и else
), а не в вашем предикате (выражение после , когда
]). Убедитесь, что select name from tableA
и select name from tableB
возвращают тот же тип результата. mycheck
должен быть логическим.
Я выполнил этот запрос в PostgreSQL 9.0beta2 и (за исключением добавления из mytable
в оператор SELECT, а также создания таблиц tableA
и tableB
]), и это не дало никаких ошибок типа. Однако я получаю сообщение об ошибке, очень похожее на описанное вами, когда запускаю следующее:
select case when true
then 1
else 'hello'::text
end;
Вышеуказанное дает:
ERROR: CASE types text and integer cannot be matched
Я только что запустил это на PostgreSQL 8:
select id,
case when mycheck = true then (...)
else (...),
someText;