在一張表中,我有一個完整的地址,我必須將其拆分為城市和郵政編碼以存盤在其他列中。
這是示例地址:
address= 'Marco Polo street 8a, 44000 Vienna'
有些行可能包含多個地址,但我必須只保留最后一個逗號 ( 44000 Vienna)之后的最后一部分。
所以最終的結果應該是:
post_office = 44000
city = Vienna
到目前為止嘗試過:https : //stackoverflow.com/a/13430958/2119941
帶有嵌套子字串,如下所示:
city = SUBSTRING(SUBSTRING(address, CHARINDEX(' ', address, 0) 1, LEN(address)), CHARINDEX(',', address, 0) 1, LEN(address))
和
post_office = SUBSTRING(SUBSTRING(address, CHARINDEX(',', address, 0) 1, LEN(address)), 0, CHARINDEX(' ', address, 0))
但這只是部分有效,因為城市也可以有多個詞,例如:
city = '44300 Vienna Old Town'
我的資料的規則是:找到最后一個逗號,取逗號后的所有數字并將其定義為post_office,然后,在第一個空格之后,post_office直到字串的其余部分,它應該被定義為城市。
我正在運行 Microsoft SQL Server 2017 (v14.0.3391.2 - X64)
uj5u.com熱心網友回復:
好吧,我想您的問題下面的評論已經詳細說明了為什么資料的存盤方式是一個壞主意,以及如果您對地址的假設不是 100% 準確,您嘗試的方式可能會失敗。
話雖如此,您可能正在嘗試解決這個問題,如果您確定您定義的規則始終適用,您就可以做您想做的事。
為此,請使用該REVERSE()函式兩次以查找 substring 的最后一次出現。這樣,您可以從最后一個逗號開始分隔所有內容。使用該TRIM()函式洗掉周圍可能出現的空格,例如,如果逗號后面直接有空格。
如果您確定郵政編碼中只有數字字符和空格,并且郵政編碼緊隨其后,則可以使用PATINDEXwithLEFT()和RIGHT()來查找第一個非數字字符,類似于此 SO post。
完整解決方案:對于輸入資料
| 地址 |
|---|
| 馬可波羅街 8a, 44000 維也納 |
| 馬可波羅街 8a, 44000 維也納老城 |
| 馬可波羅街 8a,44000 維也納 |
| Marco Polo street 8a, Marco Polo street 8b, 44 000 Vienna Old Town |
| 馬可波羅街 8a, 44 00 0 維也納 |
該宣告
with tmp as (
select TRIM(REVERSE(SUBSTRING(REVERSE(address),0,CHARINDEX(',',REVERSE(address))))) lastpart
from addresstable
)
select LEFT(lastpart, PATINDEX('%[^0-9 ]%', lastpart) -1) as postcode,
RIGHT(lastpart, len(lastpart) - PATINDEX('%[^0-9 ]%', lastpart) 1) as city
from tmp
產生結果
| 郵政編碼 | 城市 |
|---|---|
| 44000 | 維也納 |
| 44000 | 維也納老城 |
| 44000 | 維也納 |
| 44 000 | 維也納老城 |
| 44 00 0 | 維也納 |
筆記:
- 如果您不想允許空格,請將它們從 中的運算式中洗掉
PATINDEX(),即'%[^0-9]%' - 如果您希望您
postcode的型別為int,請TRY_CONVERT()與REPLACE()和一起使用NULLIF()。請參閱下面的SO 答案和 dbfiddle...
或者,如果您確定在最后一個逗號之后的任何字串直到下一個空格肯定是thepostcode并且您希望在郵政編碼中允許字母字符,那么您之前的嘗試已經做到了。但是,如果您的郵政編碼有空格,這將中斷。
with tmp as (
select TRIM(REVERSE(SUBSTRING(REVERSE(address),0,CHARINDEX(',',REVERSE(address))))) lastpart
from addresstable
)
select SUBSTRING(lastpart,0,CHARINDEX(' ',lastpart,0) 1) as postcode,
SUBSTRING(lastpart,CHARINDEX(' ',lastpart,0) 1,LEN(lastpart)) as city
from tmp
請參閱此 db<>fiddle以進行兩者的比較,包括一些不適用于兩者之一的地址示例。
uj5u.com熱心網友回復:
address= 'Marco Polo street 8a, 44000 Vienna' ; Var
newadd=Split.address(,); Var pincode =split.newadd( ); pincode[0]// is pincode 44000 pincode[1]// vienna
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/366943.html
標籤:sql sql-server
上一篇:從xml匯入到標識列
