2012-04-24 49 views
5

我已經嘗試了一些變化,但是從我的the documentation這種閱讀模式應該工作'' || val1 || val1 ...但我的結果是空列...的毗連列選擇

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) 

回答

11

一個串聯NULL帶有非空字符串會產生NULL

由於您的*_val列可以爲空,因此可能是發生了什麼情況。

試試這個:

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

,或者,如果你只能有至多一個非空值,只是這樣的:

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

注意,在PostgreSQL,不像其他一些引擎,TEXT has no downsides compared to VARCHAR 。將數據分開TEXTVARCHAR沒有意義。

1

將NULL值連接到任何其他值會產生NULL。它看起來像被連接的一些列是可以爲空的,所以你需要在它們周圍包裝一個COALESCE函數,以便當它們爲NULL時強制使用空字符串或其他佔位符值。