【问题标题】:How to query and space address with multiple values when some are NULL当某些值为 NULL 时如何使用多个值查询和空间地址
【发布时间】:2022-11-15 02:46:03
【问题描述】:

当其中一些值为 NULL 时,我正在尝试查询并正确格式化由 Oracle 中的多个值组成的地址。 Coalesce() 对此效果很好,但在我添加空格/标点符号时效果不佳。

例子

address 1: 123 Main St
address 2: Apt 1
City: New York
State: NY
Postal Code: 10001
Country: USA

address 1: NULL
address 2: NULL
City: New York
State: NULL
Postal Code: 10001
Country: USA

提取完整地址时,如果值为 NULL,我想忽略后续标点符号,这样就没有多余的逗号/空格。

select a.address1 || ' ' || a.address2 || ', ' || a.city || ', ' || a.state || ' ' || a.postal_code || ', ' || 'USA',
Coalesce(a.address1, a.address2, a.city, a.state, a.postal_code,'USA') 
from address a 
  • 示例 1 结果:123 Main St Apt 1, New York, NY 10001, USA
  • 示例 2 结果: , New York, 10001, USA

示例 2 的预期结果:纽约,10001,美国

这只是一个示例,但是当缺少任何元素组合时,我想要一条格式仍然正确的行。

【问题讨论】:

  • 只需将您构建的地址提供给 regexp_replace,如下所示:Regexp_replace(youradress, '^[ ,]+|, ?(?>,)|[ ,]+$') 。这对您构建的内容进行后处理,以查找和删除所有看起来很有趣的标点符号。这有点微妙,在中间部分使用前瞻来删除多个逗号,但至少保留一个。

标签: sql oracle


【解决方案1】:

试试 REGEXP_REPLACE('Just concat without worrying about NULL','( ,)+', '')

【讨论】:

    【解决方案2】:

    您可以使用the nvl2() function 将逗号和空格附加到每个列值,前提是它不为空,然后将它们连接在一起:

    select nvl2(address1, address1 || ', ', null)
      || nvl2(address2, address2 || ', ', null)
      || nvl2(city, city || ', ', null)
      || nvl2(state, state || ', ', null)
      || nvl2(postal_code, postal_code || ', ', null)
      || 'USA' as address
    from address
    
    ADDRESS
    123 Main St, Apt 1, New York, NY, 10001, USA
    New York, 10001, USA

    fiddle

    如果您没有在末尾添加固定的“USA”,那么您最终可能会得到一个尾随逗号,您可以将其删除。


    只是为了好玩,如果你的表有一个你没有显示的唯一列,那么你也可以取消透视和聚合:

    select listagg(value, ', ') within group (order by pos) || ', USA' as address
    from (
      select *
      from address
      unpivot (value for pos in (address1 as 1, address2 as 2, city as 3, state as 4, postal_code as 5))
    )
    group by id
    
    ADDRESS
    123 Main St, Apt 1, New York, NY, 10001, USA
    New York, 10001, USA

    fiddle

    ...但是当有更简单的方法可用时,可能不值得付出努力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多