【问题标题】:How to conditionally exclude a column from a concatenation? [duplicate]如何有条件地从串联中排除一列? [复制]
【发布时间】:2019-05-30 10:08:20
【问题描述】:

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

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

【问题讨论】:

  • 我不会那样做;处理结果的下游人员或代码让他们的生活陷入困境,因为他们现在必须计算出 CSV 中有多少地址。只需将该列留空即可。
  • @RobertHarvey 这是一个 UI,所以在地址中间有 , , 看起来很糟糕。
  • @JoshEller 这个答案很有效,谢谢

标签: sql oracle11g


【解决方案1】:

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

【讨论】:

  • 这个答案有效,虽然 DECODE(ADDRESS_LINE_3, NULL, '', ', ' || ADDRESS_LINE_3) 做同样的事情稍微干净一些
  • @rdennis42 。 . .我强烈反对。 decode() 是定制的 Oracle 函数。 CASE 是条件表达式的标准 SQL 语法。我通常更喜欢标准。
猜你喜欢
  • 2016-01-09
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-05
相关资源
最近更新 更多