我有一张桌子

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可以是空的,那么full_address也是空的.我需要忽略从apartment开始的空值.

我试着用CONCATCOALESCE,但我不知道当apartment为空时如何 suppress 悬挂的‘-’.

推荐答案

一种 Select 是使用CASE表达式:

full_address TEXT GENERATED ALWAYS AS 
    (street || ',' || case when apartment is not null then building || '-' || apartment 
                           else building end) STORED

其中-对于插入为

insert into climbers (street, building, apartment) values ('Wall street', 'A', '10');
insert into climbers (street, building, apartment) values ('5th Avenue', 'B', null);

在.中的结果

street          building    apartment   full_address
Wall street     A           10          Wall street,A-10
5th Avenue      B           null        5th Avenue,B

请参见fiddle.

Sql相关问答推荐

SQL计数所有值在联接范围内的行

使用交叉应用透视表在SQL中转换分段时间段&

将有界时间周期作为阶跃函数,其中周期开始返回1,周期结束返回0

查询多个表并返回合并在联合列上的所有表中的所有行

在Golang中管理数据库事务的简洁方法

SQL将 Select 查询作为新列添加到另一个 Select 查询

通过之前的连接-这是Oracle的错误吗?

在SQL查询中使用COALESS

在MS Access Modern图表的X轴上显示时间值时遇到问题

从结果SQL查询中排除空值

使用SQL数据库中的现有列派生或修改几个列

组合2个分区表的postgres视图的执行计划正在访问所有分区

如何用SQL组合客户拥有的产品

如何计算两个非周期性时间序列+分组的重叠持续时间

在自引用表中使用分组和计数的SQL查询语句

比使用NOT EXISTS更高效的SQL删除方法是什么?

如何显示最常引用条目的详细信息

SQL Select 最大并获取列名

SELECT 用于 Parent、Children 和 ORDER BY [Order] 列

如何比较同一张表中的行并进行相应更新