PDA

Ver la Versión Completa : UNION ALL cambia tipo de dato de retorno


FlacoNet
13-02-2010, 23:19:29
buen dia. Tengo la siguiente estructura de tabla en postgres 8.2:

CREATE TABLE tiposcliente
(
idtipoclient smallint NOT NULL,
tipoclient character varying(30) NOT NULL,
CONSTRAINT pk_tiposcliente PRIMARY KEY (idtipoclient)
)

y realizando la siguiente consulta:


select cast(0 as smallint) as idtipoclient,
cast('Todos' as varchar(30)) as tipoclient
UNION ALL
(SELECT idtipoclient, tipoclient
FROM tiposcliente
order by 2)


Tengo el problema que el campo tipoclient me sigue devolviendo un campo de tipo varchar sin limite ó memo, cuando en realidad lo estoy convirtiendo a varchar(30) como la definicion del campo original.

Devolviendome el campo como 'memo' tengo problemas para mostrarlo en el componente de datos de delphi.
¿Alguna respuesta para resolver el correcto retorno del tipo de dato?

Acabo de probar creando una vista con la misma definicion anterior:


CREATE VIEW TipoCliente as
select cast(0 as smallint) as idtipoclient,
cast('Todos' as varchar(30)) as tipoclient
UNION ALL
(SELECT idtipoclient, tipoclient
FROM tiposcliente
order by 2)


y cuando la consulta anda bien. ¿que pasara? Acaso no se puede hacer esto evitando crear la vista?

lo unico que encontre de documentacion al respecto es
http://www.postgresql.org/docs/8.3/static/typeconv-union-case.html pero sigo sin poder resolverlo.

Mil gracias a todos..

FlacoNet

movorack
14-02-2010, 00:47:23
yo tomé el codigo de tu post sin cambiarle nada y ami no me genera el error que comentas...

aún así podrias recalcar el tipo de dato a la salida...

select
cast(0 as smallint) as idtipoclient,
cast('Todos' as varchar(30)) as tipoclient
UNION ALL
SELECT
idtipoclient::SMALLINT,
tipoclient::VARCHAR(30)
FROM tiposcliente
order by idtipoclient;

por lo de la vista... mejor... para eso son las vistas... nos evitamos consultas tan largas dentro del programa.

FlacoNet
15-02-2010, 16:30:52
Gracias Movorack por tu respuesta.

No es un error en realidad lo que sucede. solo que devuelve un tipo de dato que no es el del campo original ni el que le pido al escribir ::varchar(30) en el select.

Utilizando el Pgadmin al correr la siguiente consulta:
SELECT idtipoclient, tipoclient
FROM tiposcliente
Me devuelve claramente smallint y varchar(30). A estos tipos de datos los veo en el titulo de las columnas devueltas por el pgadmin.

El mismo tipo de dato me devuelve cuando uso la vista, es decir OK, pero cuando ejecuto la consulta con union:
select
cast(0 as smallint) as idtipoclient,
cast('Todos' as varchar(30)) as tipoclient
UNION ALL
SELECT
idtipoclient::SMALLINT,
tipoclient::VARCHAR(30)
FROM tiposcliente
order by idtipoclient;

...el tipo de dato devuelto en las columnas es el que sigue:
smallint y varchar. Y no especifica que sea varchar(30), por lo tanto se trata de un campo MEMO.

Espero se entienda y muchas gracias por tu tiempo

Esteban

movorack
15-02-2010, 17:13:52
yo tambien usé el pgadmin para las pruebas e hice los mismos pasos que vos. y al ejecutar el SQL del UNION me devolvió VARCHAR(30)...
http://lh5.ggpht.com/_IuT93QvTKI0/S3l0Ps-NJkI/AAAAAAAAAwE/UaLR-QLhlQE/select_union.gif

FlacoNet
16-02-2010, 16:24:51
Que raro. Viendo los resultados que vos tuviste no me quedó otra opcion que instalar la version nueva de postgres para windows, de la 8.2 que tenia a la 8.4.2-1. Haciendo esto ya me devuelve correctamente el tipo de dato solicitado en el select :D

Saludos y muchas gracias