简体   繁体   English

postgresql中的concat列选择

[英]Concat columns in postgresql select

I've tried a few variations, but from my reading of the the documentation this pattern should work '' || val1 || val1 我尝试了一些变化,但是从我对文档的阅读中,这个模式应该可以正常工作'' || val1 || val1 '' || val1 || val1 '' || val1 || val1 ... yet my result is an empty column ... '' || 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)

Concatenating a NULL with a non-empty string yields a NULL NULL与非空字符串连接会产生NULL

Since your *_val columns are nullable, it's probably what is happening. 由于您的*_val列可以为空,因此可能正在发生的事情。

Try this: 试试这个:

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

or, if you can only have at most one non-null value, just this: 或者,如果您最多只能有一个非空值,只需:

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

Note that in PostgreSQL , unlike some other engines, TEXT has no downsides compared to VARCHAR . 请注意,在PostgreSQL ,与其他引擎不同, TEXTVARCHAR相比没有任何缺点 There is no point in separating TEXT and VARCHAR data. 分离TEXTVARCHAR数据毫无意义。

Concatenating a NULL value to any other value produces a NULL. 将NULL值连接到任何其他值会产生NULL。 It looks like some of the columns being concatenated are nullable, so you will need to wrap a COALESCE function around them to force an empty string or some other placeholder value when they're NULL. 看起来连接的某些列是可空的,因此您需要在它们周围包装COALESCE函数以在空字符串或其他占位符值为NULL时强制它们。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM