SQL Server 字串動態依數字英文和中文拆分

最近遇到一個小問題,在 ms sql server 資料庫中,有個欄位儲存代號+名稱的資料,範例內容如下:
    

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

留言