2017-01-16 25 views
0

分割字符串我有以下欄(與虛構數據):SQL服務器 - 去年發生的歷史數

Location 
--------------- 
15630London 
45680Edinburg 
138739South Wales 

此列同時包含郵編和城市名稱。我想將這2個分成2個獨立的列。

在這種情況下

所以,我的輸出是:

Zip | City 
-------|--------- 
15630 | London 
45680 | Edinburg 
138739 | South Wales 

我試着用

LEFT(location,LEN(location)-CHARINDEX('L',location)) 

的郵政編碼但我無法找出如何設置CHARINDEX在所有信件的工作。

任何建議/其他想法?

+0

zip總是5位數? –

+0

您提供的所有條目都以五位數字開頭。我們可以依靠這個,還是巧合? – Mureinik

+0

@AlexK。這是真誠的。可能多於或少於5位 – DenStudent

回答

1

檢測從左邊的許多字符的第一個非數字字符和拉,然後讀取超出該點到最後:

select 
    left(Location, patindex('%[^0-9]%', Location) - 1), 
    substring(Location, patindex('%[^0-9]%', Location), len(Location)) 
from t 
+1

英國郵政編碼是字母和數字的組合。 OP類型的隨機數據,或者在這個問題背後隱藏着另一個問題 –

+0

我假設數據是隨機的,倫敦沒有郵政編碼。 –

+0

否*單*郵政編碼。它們中沒有一個可以按照OP的要求進行解析。我不認爲OP的問題可以通過在非規範化之後分割數據來解決 –

1
declare @string varchar(200)='15630London' 

select substring(@string,1,patindex('%[a-z,A-Z]%',@string)-1), 
substring(@string,patindex('%[a-z,A-Z]%',@string),len(@string)) 
2

這裏使用PATINDEX一種方式,一些字符串函數

SELECT LEFT(Location, Patindex('%[a-z]%', Location) - 1), 
     Substring(Location, Patindex('%[a-z]%', Location), Len(Location)) 
FROM (VALUES ('15630London'), 
       ('45680Edinburg'), 
       ('138739South Wales'))tc(Location) 

注:以上代碼總是認爲郵政編碼是數字和字符只能用城市名稱的開始nd city存在於所有行(即)字符串存在於每行