我有一张table
CREATE TABLE IF NOT EXISTS club.climbers
(
climber_id SERIAL PRIMARY KEY,
climber_first_name VARCHAR(20) NOT NULL,
climber_last_name VARCHAR(30) NOT NULL,
climber_full_name TEXT GENERATED ALWAYS AS (climber_first_name || ' ' || climber_last_name) STORED NOT NULL,
sex_id INTEGER NOT NULL REFERENCES club.sex,
climber_date_birth DATE NOT NULL,
climber_phone VARCHAR(20) NOT NULL,
postal_code_id INTEGER REFERENCES club.postal_codes,
street VARCHAR(75) NOT NULL,
building VARCHAR(5) NOT NULL,
apartment VARCHAR(5),
full_address TEXT GENERATED ALWAYS AS (street || ',' || building || '-' || apartment) STORED
);
字符串
但是apartment
可以是NULL,那么full_address
也会是NULL。我需要忽略来自apartment
的NULL值。
我尝试使用CONCAT
和COALESCE
,但我不知道如何在apartment
为NULL时抑制悬空'-'。
4条答案
按热度按时间sy5wg1nm1#
您可以在coalesce()的第一个参数中包含
-
,如下所示:字符串
xqk2d5yq2#
一种选择是使用
CASE
表达式:字符串
其对于作为
型
导致
型
请参阅fiddle。
vm0i2vca3#
你可以尝试这个解决方案,我没有任何例子来全面检查,但我相信它会工作。
字符串
cqoc49vn4#
对于一个只有一列的情况,Andomar的版本似乎是最好的。自定义函数会大材小用。
重复使用/多列
优化的表达式,在适当的地方使用白色空格和分隔符(仅):
字符串
immutable_concat_ws()
是一个自定义函数,如下所述。基本上:
型
参见:
但生成的列需要**
IMMUTABLE
**表达式,请参见:因此,创建自定义
immutable_concat_ws()
仅用于文本输入(在您的情况下保证)。理想情况下,作为超级用户:型
参见:
或者,没有超级用户权限,并作为“标准SQL”函数(需要Postgres 14+).参见:
型