我有一個使用連字符分隔的八個值的單串列,其中一些是空白的。我正在嘗試將此字串拆分為列,每個值對應于分隔字串的位置:
表格1:
| 記錄 | 字串值 |
|---|---|
| 推薦1 | 422100----130-1034-10901-12000 |
| 記錄2 | 421100--企業--130-1034-- |
| 記錄3 | 423000----130-1561-- |
| REC4 | 111500-------- |
| REC5 | 661300-710-CORP--355-1106-10901-10100 |
期望的結果:
| 記錄 | col1 | col2 | col3 | col4 | col5 | col6 | col7 | col8 |
|---|---|---|---|---|---|---|---|---|
| 推薦1 | 422100 | 無效的 | 無效的 | 無效的 | 130 | 1034 | 10901 | 12000 |
| 記錄2 | 421100 | 無效的 | 公司 | 無效的 | 130 | 1034 | 無效的 | 無效的 |
| 記錄3 | 423000 | 無效的 | 無效的 | 無效的 | 130 | 1561 | 無效的 | 無效的 |
| REC4 | 111500 | 無效的 | 無效的 | 無效的 | 無效的 | 無效的 | 無效的 | 無效的 |
| REC5 | 661300 | 710 | 公司 | 無效的 | 355 | 1106 | 10901 | 10100 |
我嘗試了一系列復雜的 SUBSTRING/CHARINDEX 函式,這些函式可以作業,但我很好奇是否有更合適的解決方案?當我嘗試使用 PARSENAME 函式時,它只回傳 NULL 值,因為字串中的每個位置都沒有一個值。
SELECT
Record
,PARSENAME(REPLACE(StringValue, '-', '.'), 1) AS col1
,PARSENAME(REPLACE(StringValue, '-', '.'), 2) AS col2
,PARSENAME(REPLACE(StringValue, '-', '.'), 3) AS col3
,PARSENAME(REPLACE(StringValue, '-', '.'), 4) AS col4
,PARSENAME(REPLACE(StringValue, '-', '.'), 5) AS col5
,PARSENAME(REPLACE(StringValue, '-', '.'), 6) AS col6
,PARSENAME(REPLACE(StringValue, '-', '.'), 7) AS col7
,PARSENAME(REPLACE(StringValue, '-', '.'), 8) AS col8
FROM table1
uj5u.com熱心網友回復:
如您所知, parsename() 僅限于 4 個位置。
這是一個 JSON 選項(假設 2016 )
Select A.Record
,Pos1 = nullif(JSON_VALUE(JS,'$[0]'),'') --nullif() optional otherwise empty string
,Pos2 = nullif(JSON_VALUE(JS,'$[1]'),'')
,Pos3 = nullif(JSON_VALUE(JS,'$[2]'),'')
,Pos4 = nullif(JSON_VALUE(JS,'$[3]'),'')
,Pos5 = nullif(JSON_VALUE(JS,'$[4]'),'')
,Pos6 = nullif(JSON_VALUE(JS,'$[5]'),'')
,Pos7 = nullif(JSON_VALUE(JS,'$[6]'),'')
,Pos8 = nullif(JSON_VALUE(JS,'$[7]'),'')
From YourTable A
Cross Apply (values ('["' replace(string_escape([StringValue],'json'),'-','","') '"]') ) B(JS)
結果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/521726.html
