Sql 如何有条件地从串联中排除列?
在oraclesql中,我试图将几个字段中的地址连接起来,如下所示Sql 如何有条件地从串联中排除列?,sql,oracle11g,Sql,Oracle11g,在oraclesql中,我试图将几个字段中的地址连接起来,如下所示 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) ); I
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');
不幸的是,在我的数据集中,有很多地址在地址线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;
但是它似乎没有改变任何东西,因为Oracle使用|
操作符将NULL
视为空字符串,所以您的coalesce()
不起作用
您可以使用案例解决此问题:
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;
您的coalesce()
无法工作,因为Oracle使用|
运算符将NULL
视为空字符串
您可以使用案例解决此问题:
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;
我不会那样做;对于下游人员或代码来说,处理结果简直就是地狱,因为他们现在必须计算出CSV中有多少地址。让这个栏空空如也。看看@ RoBrthARVEY,这是一个UI,所以在地址中间看起来很糟糕。对于下游人员或代码来说,处理结果简直就是地狱,因为他们现在必须计算出CSV中有多少地址。只需将该栏空出。请参阅“RoBrthARVEY”,这将是一个UI,因此在地址中间有一个很糟糕的地方。@ JojHeLe,答案非常好,谢谢。这个答案是有效的,虽然解码(AddiSsRayLay3,NULL,‘,’,’,’i AddiSrayLayn3’做了同样的事情。cleaner@rdennis42 . . . 我个人强烈反对decode()
是一个定制的Oracle函数CASE
是条件表达式的标准SQL语法。我通常更喜欢标准。这个答案是有效的,尽管解码(地址线3,空,,,,,,,;,地址线3)做的事情稍微相同cleaner@rdennis42 . . . 我个人强烈反对decode()
是一个定制的Oracle函数CASE
是条件表达式的标准SQL语法。我通常更喜欢标准。