我需要帮助编写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”。
答案 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 ;