Случай Postgresql и тестирование логических полей - PullRequest
6 голосов
/ 22 июня 2010

Во-первых: я запускаю postgresql 8.2 и тестирую свои запросы на pgAdmin.

У меня есть таблица с некоторыми полями, скажем:

mytable(
  id integer,
  mycheck boolean,
  someText varchar(200));

Теперь я хочу подобный запросна это:

 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 не имеет if, только case, как мне сделать if с логическим полем?

Ответы [ 2 ]

11 голосов
/ 22 июня 2010

Ваша проблема - несоответствие в ваших значениях (выражения после then и else), а не в вашем предикате (выражение после when). Убедитесь, что select name from tableA и select name from tableB возвращают одинаковый тип результата. mycheck должен быть логическим.

Я выполнил этот запрос на PostgreSQL 9.0beta2 и (за исключением необходимости добавлять from mytable в оператор SELECT, а также создания таблиц tableA и tableB), и он не привел к ошибкам типа. Тем не менее, я получаю сообщение об ошибке, очень похожее на то, которое вы описали, когда запускаю следующее:

select case when true
           then 1
           else 'hello'::text 
       end;

Вышеуказанные выходы:

ERROR:  CASE types text and integer cannot be matched
0 голосов
/ 22 июня 2010

Я только что выполнил это нормально на PostgreSQL 8:

select id,
 case when mycheck = true then (...)
      else (...),
 someText;
...