PL / SQL在街道号码和街道名称中拆分完整地址

时间:2014-04-25 15:17:32

标签: sql regex oracle plsql

我需要帮助编写PL / SQL脚本。 我想在街道编号和街道名称的2个其他列中拆分包含地址的列。

这些是法语地址,必须以这种方式格式化:

Address
--------------------
10 BIS RUE DE LA REPUBLIQUE
15 RUE DU 18 DECEMBRE
CC LES 4 TEMPS
5 TER IMPASSE DE LA VIGNE
7 QUATER AV CHARLES DE GAULLE

Number  |Street
--------------------
10B     |RUE DE LA REPUBLIQUE
15      |RUE DU 18 DECEMBRE
        |CC LES 4 TEMPS
5T      |IMPASSE DE LA VIGNE
7Q      |AV CHARLES DE GAULLE

1)当地址以数字开头时,该数字用于数字列。如果地址包含数字,而不是开头,则会显示在街道列中。

2)如果街道号码后跟“BIS”,“TER”,“QUATER”或“QUINQUIES”,则街道号码后跟“B”,“T”,“Q”或“C”。

1 个答案:

答案 0 :(得分:0)

试试这个。对我来说,它看起来很麻烦,但很有效。我想它可以用更优化的方式编写。

  WITH t(address) AS
    (SELECT '10 BIS RUE DE LA REPUBLIQUE'
     FROM dual
     UNION ALL SELECT '15 RUE DU 18 DECEMBRE'
     FROM dual
     UNION ALL SELECT 'CC LES 4 TEMPS'
     FROM dual
     UNION ALL SELECT '5 TER IMPASSE DE LA VIGNE'
     FROM dual
     UNION ALL SELECT '7 QUATER AV CHARLES DE GAULLE'
     FROM dual)
SELECT address ,
       CASE
           WHEN REGEXP_LIKE(address, '^[0-9]+\s+(BIS|TER|QUATER|QUINQUIES)') THEN REGEXP_REPLACE(REGEXP_SUBSTR(address,'^[0-9]+\s+.'),'\s+')
           WHEN REGEXP_LIKE(address, '^[0-9]+') THEN REGEXP_SUBSTR(address,'^[0-9]+')
       END num ,
       CASE
           WHEN REGEXP_LIKE(address, '^[0-9]+\s+(BIS|TER|QUATER|QUINQUIES)?') THEN TRIM(REGEXP_REPLACE(address, '^[0-9]+\s+(BIS|TER|QUATER|QUINQUIES)?'))
           ELSE address
       END street
FROM t ;