如何从 ORACLE 中的字符串中分离出特定部分并放入其自己的列中?

问题描述 投票:0回答:1

假设我有以下数据集:

地址_1 地址_2
邮政信箱123
公司名称 ONE 1234 ROSE AVE STE 100
456号矮牵牛路五楼
公司名称 2 PO BOX 78910
公司名称三号1112 DAISY ST THIRD FLOOR

我想弄清楚两件事 -

  1. 如何在地址开头之前分隔任何公司名称。基本上,如果字符串不以“PO”或任何数字序列(例如:456、1112 等)开头,则取出该部分并将其放入新列

  2. 如何直接获取单词“FLOOR”左侧的子字符串以生成新列。如果我可以将“FIFTH FLOOR”一起拉出来,那就太好了,但如果不能的话,我总是可以将“FLOOR”连接到新列的末尾

我希望我的数据结果如下:

地址_1 地址_2 公司名称 ADDR_LNE_1_NM ADDR_LNE_2_NM
邮政信箱123 邮政信箱123
公司名称 ONE 1234 ROSE AVE STE 100 公司名称一 1234 玫瑰大道 STE 100
456号矮牵牛路五楼 456 矮牵牛路 五楼
公司名称 2 PO BOX 78910 公司名称二 邮政信箱78910
公司名称三号1112 DAISY ST THIRD FLOOR 公司名称三 1112 雏菊 ST 三楼

这是我用于分离子字符串“FLOOR”的当前代码。我只需要知道如何修改或更改此代码以在其中包含“第五”和“第三”(以及任何其他写出的数字),就像在输出中一样。也许可以将所有内容拉到“FLOOR”左侧的第一个空格?

CASE
    WHEN 
        database.table.Address_1 like '% FLOOR%'
        THEN 
            TRIM(SUBSTR(database.table.Address_1, 0, INSTR(database.table.Address_1, ' FLOOR')-1))

END "ADDR_LNE_1_NM",


CASE
    WHEN
        database.table.Address_1 like '% FLOOR%'
        THEN
            TRIM(SUBSRT(database.table.Address_1, DECODE(INSTR(database.table.Address_1, ' FLOOR'), 0, NULL, INSTR(database.table.Address_1, ' FLOOR'))))

END "ADDR_LNE_2_NM"

我没有任何分隔公司名称的代码。那个我不知所措。

谢谢!

sql oracle street-address
1个回答
0
投票

我会使用 Oracle 提供的正则表达式函数:

REGEXP_SUBSTR()
剪掉楼层和公司名称的部分,
REGEXP_REPLACE()
删除地址中的“n 楼”部分:

WITH
indata(Address_1,Address_2) AS (
          SELECT 'PO BOX 123'                                  ,NULL      FROM dual
UNION ALL SELECT 'COMPANY NAME ONE 1234 ROSE AVE'              ,'STE 100' FROM dual
UNION ALL SELECT '456 PETUNIA WAY FIFTH FLOOR'                 ,NULL      FROM dual
UNION ALL SELECT 'COMPANY NAME TWO PO BOX 78910'               ,NULL      FROM dual
UNION ALL SELECT 'COMPANY NAME THREE 1112 DAISY ST THIRD FLOOR',NULL      FROM dual
)
SELECT
  address_1
, address_2
, REGEXP_SUBSTR(address_1,'^.+ (?=(PO BOX|\d+ \w+))') AS compname
, REGEXP_REPLACE(
    REGEXP_SUBSTR(address_1,'(PO BOX \d+|\d+).*$')
  , '\w+ FLOOR'
  , ''
  )  AS addr_ln_1
, NVL(REGEXP_SUBSTR(address_1,'\w+ FLOOR$'),address_2) AS addr_ln_2
FROM indata;                                                                                          
ADDRESS_1 ADDRESS_2 公司名称 ADDR_LN_1 ADDR_LN_2
邮政信箱123 邮政信箱123
公司名称 ONE 1234 ROSE AVE STE 100 1234 玫瑰大道 STE 100
456 矮牵牛路五楼 456 矮牵牛路 五楼
公司名称 2 PO BOX 78910 邮政信箱78910
公司名称三号1112 DAISY ST THIRD FLOOR 1112 雏菊 ST 三楼

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.