我尝试了一些变体,但是从我对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)
答案 0 :(得分: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
不同。将TEXT
和VARCHAR
数据分开是没有意义的。
答案 1 :(得分:1)
将NULL值连接到任何其他值会产生NULL。看起来连接的某些列是可空的,因此您需要在它们周围包装COALESCE函数以强制空字符串或其他占位符值为NULL。