首页 > 解决方案 > 如何有条件地从串联中排除一列?

问题描述

在 Oracle SQL 中,我试图从几个看起来像这样的字段中连接一个地址

CREATE TABLE sql_test_c 
( 
    ADDRESS_LINE varchar(255), 
    ADDRESS_LINE_2 varchar(255), 
    ADDRESS_LINE_3 varchar(255),
    CITY_NAME varchar(255),
    STATE_CODE varchar(255),
    ZIP_CODE varchar(255)
); 

INSERT INTO sql_test_c (ADDRESS_LINE, ADDRESS_LINE_2, CITY_NAME, STATE_CODE, ZIP_CODE) VALUES ('Business Name', '123 Main Street', 'Seattle', 'WA', '12345');

不幸的是,在我的数据集中有很多地址在 ADDRESS_LINE_3 中没有任何内容(比如这个)所以当我使用

SELECT ADDRESS_LINE || ', ' || 
       ADDRESS_LINE_2 || ', ' ||
       ADDRESS_LINE_3 || ', ' ||
       CITY_NAME || ', ' ||
       STATE_CODE || ' ' ||
       ZIP_CODE
FROM sql_test_c;

我最终得到

Business Name, 123 Main Street, , Seattle, WA 12345

在地址和城市之间使用这两个逗号。如果列是否为空,有没有办法动态包含列?我尝试过各种形式的合并,例如:

SELECT ADDRESS_LINE || ', ' || 
       ADDRESS_LINE_2 || ', ' ||
       COALESCE(ADDRESS_LINE_3 || ', ', '') ||
       CITY_NAME || ', ' ||
       STATE_CODE || ' ' ||
       ZIP_CODE
FROM sql_test_c;

但它似乎并没有改变任何东西

标签: sqloracle11g

解决方案


coalesce()不起作用,因为 Oracle 将运算符NULL视为空字符串||

您可以使用以下方法解决此问题case

SELECT ADDRESS_LINE || ', ' || 
       ADDRESS_LINE_2 || ', ' ||
       (CASE WHEN ADDRESS_LINE_3 IS NOT NULL THEN ADDRESS_LINE_3 || ', ' END) ||
       CITY_NAME || ', ' ||
       STATE_CODE || ' ' ||
       ZIP_CODE
FROM sql_test_c;

推荐阅读