获取下划线前的字符,并用逗号从SQL Server 2008中的字符串中分隔

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个逗号分隔值.

Shn*_*ugo 5

你可能会走这条路:

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这样的通用格式来存储它或相关边表的结构.但是这种结构往往会成为颈部真正的痛苦......