2014-04-25 100 views
1

我需要編寫PL/SQL腳本的幫助。 我想拆分一個包含街道號碼和街道名稱的其他兩列中地址的列。PL/SQL拆分街道號碼和街道名稱的完整地址

那些是法國地址和格式必須是這樣的:

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

安迪的權利,但很可能有人會爲他寫信 – tbone

+0

歡迎來到堆棧溢出!這是一個網站,您可以提問並獲得關於您使用自己編寫的軟件遇到的問題的答案。然而,這並不是一個「爲我做作業」的網站。當你問一個問題時,你應該包括你寫的代碼和你得到的具體錯誤;或者,程序產生的結果以及您預期結果的解釋。如果沒有這些,我們可以做很多事情來幫助你。請編輯您的問題以顯示您已完成的工作以及告訴我們代碼存在哪些問題。再次,歡迎來到Stack Overflow! –

回答

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 ;