最近遇到一個小問題,在 ms sql server 資料庫中,有個欄位儲存代號+名稱的資料,範例內容如下:
要將數字+英文和後面的文字拆分,如果沒有數字+英文則第一格空白,如果沒有中文則第二行空白
範例:
一開始想到的就是使用正則表達式先將前面的資料找到結尾的 index,再依照 index 將前後資料分開
使用正則表達式取得不包含 0-9 和 A-Z 大小寫的部分,一般數字在正則中是 \d 而 \w 代表 0-9 和 A-Z 大小寫再加上底線,但是因為 ms sql server 不支援,所以直接寫成 '%[^0-9A-Za-z]%', 因為會一直用到索引(index),所以將原先資料和 index 做內部查詢(inner query),達成類似宣告變數,也因為 index 是關鍵字,所以命名為 inx
因為可能有空白、空字串或是不包含英文+數字或不包含是中文的內容,所以全部要做判斷
直接上結果:
延伸閱讀:Microsoft SQL Server 在 select 中的 if else 替代方式示範
參考資料:
Microsoft.Learn - Search Text with Regular Expressions
1234
AA123
BCBC中文
E33322字串字串
文字文字
22內容
要將數字+英文和後面的文字拆分,如果沒有數字+英文則第一格空白,如果沒有中文則第二行空白
範例:
1234
AA123
BCBC 中文
E33322 字串字串
文字文字
22 內容
一開始想到的就是使用正則表達式先將前面的資料找到結尾的 index,再依照 index 將前後資料分開
使用正則表達式取得不包含 0-9 和 A-Z 大小寫的部分,一般數字在正則中是 \d 而 \w 代表 0-9 和 A-Z 大小寫再加上底線,但是因為 ms sql server 不支援,所以直接寫成 '%[^0-9A-Za-z]%', 因為會一直用到索引(index),所以將原先資料和 index 做內部查詢(inner query),達成類似宣告變數,也因為 index 是關鍵字,所以命名為 inx
select *
from (select UNIT,
PATINDEX('%[^0-9A-Za-z]%', UNIT) as inx
from my_test_view) as t;
因為可能有空白、空字串或是不包含英文+數字或不包含是中文的內容,所以全部要做判斷
直接上結果:
select UNIT,
inx,
(CASE
WHEN inx <= 0 THEN UNIT
ELSE SUBSTRING(UNIT, 1, inx - 1)
END) as C1,
(CASE
WHEN inx = 0 THEN ''
WHEN inx = 1 THEN UNIT
ELSE SUBSTRING(UNIT, inx, LEN(UNIT))
END) as C2
from (select UNIT,
PATINDEX('%[^0-9A-Za-z]%', UNIT) as inx
from my_test_view) as t;
延伸閱讀:Microsoft SQL Server 在 select 中的 if else 替代方式示範
參考資料:
Microsoft.Learn - Search Text with Regular Expressions
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com