Ash*_*yal 0 t-sql sql-server-2008
我试过这个查询
DECLARE @AdvancedSearchSelectedDropdownName TABLE (
SelectedIds VARCHAR(2048),
AdvanceSearchOptionTypeId INT
)
INSERT INTO @AdvancedSearchSelectedDropdownName
VALUES ('4_0,5_1,6_2,7_3', 23),
('62_3', 21), ('2_4', 23)
DECLARE @selectedIds VARCHAR(MAX) = '';
SELECT @selectedIds +=
CASE WHEN SelectedIds IS NULL
THEN @selectedIds + ISNULL(SelectedIds + ',', '')
WHEN SelectedIds IS NOT NULL
THEN SUBSTRING(SelectedIds, 0, CHARINDEX('_', SelectedIds, 0)) + ','
END
FROM @AdvancedSearchSelectedDropdownName WHERE advanceSearchOptionTypeId = 23
SELECT @selectedIds
Run Code Online (Sandbox Code Playgroud)
电流输出:4,2
所需产量:4,5,6,7,2
我们可能在SelectedIds列中有n个逗号分隔值.
你可能会走这条路:
WITH Casted AS
(
SELECT *
,CAST('<x><y>' + REPLACE(REPLACE(SelectedIds,'_','</y><y>'),',','</y></x><x><y>') + '</y></x>' AS XML) SplittedToXml
FROM @AdvancedSearchSelectedDropdownName
)
SELECT *
FROM Casted;
Run Code Online (Sandbox Code Playgroud)
这将以此形式返回您的数据:
<x>
<y>4</y>
<y>0</y>
</x>
<x>
<y>5</y>
<y>1</y>
</x>
<x>
<y>6</y>
<y>2</y>
</x>
<x>
<y>7</y>
<y>3</y>
</x>
Run Code Online (Sandbox Code Playgroud)
现在我们可以抓住所有x和第一个y:
WITH Casted AS
(
SELECT *
,CAST('<x><y>' + REPLACE(REPLACE(SelectedIds,'_','</y><y>'),',','</y></x><x><y>') + '</y></x>' AS XML) SplittedToXml
FROM @AdvancedSearchSelectedDropdownName
)
SELECT Casted.AdvanceSearchOptionTypeId AS TypeId
,x.value('y[1]/text()[1]','int') AS IdValue
FROM Casted
CROSS APPLY SplittedToXml.nodes('/x') A(x);
Run Code Online (Sandbox Code Playgroud)
结果:
TypeId IdValue
23 4
23 5
23 6
23 7
21 62
23 2
Run Code Online (Sandbox Code Playgroud)
以这种格式存储数据是一个非常糟糕的主意.您可以使用像我的XML这样的通用格式来存储它或相关边表的结构.但是这种结构往往会成为颈部真正的痛苦......
| 归档时间: |
|
| 查看次数: |
67 次 |
| 最近记录: |