我有一列包含封裝在<::>. 我想將這些部分分成單獨的列。
資料列如下所示:
<:abc:><:xyz:><:dds:>
<:dae:><:xr:><:s:>
想要的結果
Col1 Col2 Col3
----------------
abc xyz dds
dae xr s
uj5u.com熱心網友回復:
小心STRING_SPLIT(). 它不保證回傳預期的排序順序。
我的建議使用 XML。嘗試這個:
--宣告的表變數中的一些測驗資料
DECLARE @tbl TABLE(ID INT IDENTITY, YourString VARCHAR(1000));
INSERT INTo @tbl(YourString) VALUES('<:abc:><:xyz:><:dds:>'),
('<:dae:><:xr:><:s:>');
--查詢
SELECT A.x.value('x[1]','varchar(1000)') AS col1
,A.x.value('x[2]','varchar(1000)') AS col2
,A.x.value('x[3]','varchar(1000)') AS col3
FROM @tbl t
CROSS APPLY(SELECT CAST(REPLACE(REPLACE(t.YourString,'<:','<x>'),':>','</x>') AS XML)) A(x);
簡而言之的想法
- 我們替換您的分隔符以獲得可轉換的 XML。
- 我們使用 APPLY 將這個強制轉換的 XML 添加到我們的結果集中。
- 我們按每個元素的位置獲取每個元素 (XQuery)
從 v2016 開始,推薦的方法為此使用 JSON:
SELECT JSON_VALUE(A.j,'$[0]') AS col1
,JSON_VALUE(A.j,'$[1]') AS col2
,JSON_VALUE(A.j,'$[2]') AS col3
FROM @tbl t
CROSS APPLY(SELECT REPLACE(REPLACE(REPLACE(t.YourString,':><:','","'),'<:','["'),':>','"]')) A(j);
...或這個(見雙方括號):
SELECT A.*
FROM @tbl t
CROSS APPLY OPENJSON(REPLACE(REPLACE(REPLACE(t.YourString,':><:','","'),'<:','[["'),':>','"]]'))
WITH(col1 VARCHAR(1000) '$[0]'
,col2 VARCHAR(1000) '$[1]'
,col3 VARCHAR(1000) '$[2]') A;
思路是一樣的。。。
提示:在 XML(元素)和 JSON 陣列中,排序順序是安全的。
uj5u.com熱心網友回復:
您可以使用string_split它,但是不能保證總是以相同的順序回傳行,因此我更喜歡將OpenJson用于小資料集,因為它提供了一致的索引。
with d as (
select '[' Stuff(Translate(data,':<>','", '),1,1,'') ']' data
from t
)
select
max(case when j.[key]=0 then j.[value] end) Col1,
max(case when j.[key]=1 then j.[value] end) Col2,
max(case when j.[key]=2 then j.[value] end) Col3
from d
cross apply OpenJson(d.data)j
group by d.data
演示小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/311511.html
標籤:sql sql-server 查询语句
下一篇:如何為整個資料庫生成腳本
