2010-06-22 27 views
5

Primero: estoy ejecutando postgresql 8.2 y probando mis consultas en pgAdmin.Caso de Postgresql y campos booleanos de prueba

Tengo una tabla con algunos campos, dicen:

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

Ahora, yo quiero una consulta similary a esto:

select id, 
    case when mycheck then (select name from tableA) 
     else (select name from tableB) end as mySpecialName, 
    someText; 

Traté de correr y conseguir esto:

ERROR: CASE types character varying and boolean cannot be matched 
SQL state: 42804 

E incluso tratando de engañar a postgresql con

case (mycheck::integer) when 0 then 

no funcionó.

Entonces, mi pregunta es: dado que sql no tiene si, solo el caso, ¿cómo se supone que debo hacer un if con un campo booleano?

Respuesta

10

Su problema es una falta de coincidencia en sus valores (expresiones después de then y else), no su predicado (expresión después de when). Asegúrese de que select name from tableA y select name from tableB devuelvan el mismo tipo de resultado. mycheck se supone que es un booleano.

que corrió esta consulta en PostgreSQL 9.0beta2, y (a excepción de tener que añadir from mytable a la instrucción SELECT, así como la creación de tablas y tableAtableB), y no dió ningún tipo de errores. Sin embargo, me sale un mensaje de error parecido al que usted ha descrito cuando corro el siguiente:

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

Los anteriores se obtiene:

ERROR: CASE types text and integer cannot be matched 
0

Me acabo de encontrar esta muy bien en PostgreSQL 8:

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