Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何有条件地从串联中排除列?_Sql_Oracle11g - Fatal编程技术网

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

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

在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)
); 

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语法。我通常更喜欢标准。