2012-04-24 16 views
5

He probado algunas variaciones, pero desde mi lectura de la the documentation este patrón debería trabajar '' || val1 || val1 ... sin embargo, mi resultado es una columna vacía ...columnas ConCat en PostgreSQL seleccionar

thedb=# \d buildings_propertyvalue; 
           Table "public.buildings_propertyvalue" 
    Column |   Type   |        Modifiers        
-----------+------------------------+---------------------------------------------------------------------- 
id  | integer    | not null default nextval('buildings_propertyvalue_id_seq'::regclass) 
prop_id | integer    | not null 
place_id | integer    | not null 
float_val | double precision  | 
int_val | integer    | 
char_val | character varying(255) | 
text_val | text     | 

thedb=# select * from buildings_propertyvalue limit 10; 
id | prop_id | place_id | float_val | int_val | char_val | text_val 
-----+---------+----------+-----------+---------+----------+---------- 
798 |  3 |  170 |   |  831 |   | 
    2 |  46 |  180 |   |  0 |   | 
733 |  2 |  180 |  40 |   |   | 
737 |  10 |  180 |   |  0 |   | 
740 |  5 |  345 |  100 |   |   | 
742 |  10 |  345 |   |  0 |   | 
    11 |  2 |  170 |  50 |   |   | 
744 |  11 |  345 |   0 |   |   | 
746 |  14 |  345 |   |   | 52  | 
749 |  46 |  348 |   |  0 |   | 
(10 rows) 

thedb=# select prop_id, place_id, '' || float_val || int_val || char_val || text_val as val from buildings_propertyvalue limit 10; 
prop_id | place_id | val 
---------+----------+----- 
     3 |  170 | 
     46 |  180 | 
     2 |  180 | 
     10 |  180 | 
     5 |  345 | 
     10 |  345 | 
     2 |  170 | 
     11 |  345 | 
     14 |  345 | 
     46 |  348 | 
(10 rows) 

Respuesta

11

La concatenación de una NULL con una cadena no vacía produce NULL

Dado que sus columnas *_val son nulas, es probable que sea lo que está sucediendo.

Prueba esto:

'' || COALESCE(float_val::TEXT, '') || COALESCE(int_val::TEXT, '') || COALESCE(char_val, '') || COALESCE(text_val, '') 

o, si sólo puede tener como máximo un valor no nulo, simplemente esto:

COALESCE(float_val::TEXT, int_val::TEXT, char_val, text_val, '') 

Nótese que en PostgreSQL, a diferencia de otros motores, TEXT has no downsides compared to VARCHAR . No tiene sentido separar los datos TEXT y VARCHAR.

1

Concatenar un valor NULO a cualquier otro valor produce un NULL. Parece que algunas de las columnas que se concatenan son anulables, por lo que deberá ajustar una función COALESCE para forzar una cadena vacía o algún otro valor de marcador de posición cuando sean NULL.

Cuestiones relacionadas