如何有条件地从串联中排除列?

时间:2019-01-03 19:37:02

标签: sql oracle11g

在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

在地址和城市之间使用这两个逗号。是否可以动态包含列(如果它们为null或不为null)?我已经尝试过各种形式的合并,例如:

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

但是它似乎并没有改变

1 个答案:

答案 0 :(得分:3)

您的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;