在每次出现分隔符时拆分字符串

Split string at each occurrence of delimiter

我需要在出现每个分隔符时将此字符串拆分为多个字段,如下所示:

Display Value
466500-GO-INF-ITAPPS-EMP-CLERADM

Main Account  Business Unit   Department Cost Center   Asset Type   Classification
466500        GO              INF        ITAPPS        EMP          CLERADM

我目前正在使用下面的查询删除“-”之前的字符:

stuff([DISPLAYVALUE], 1, charindex('-', [DISPLAYVALUE]), '')

然后我对 return “-”之前的字符执行此查询:

case

when charindex('-',[DISPLAYVALUE])>0

then Substring([DISPLAYVALUE], 1, Charindex('-', [DISPLAYVALUE])-1)

else [DISPLAYVALUE]

end

不幸的是,这会导致多个辅助列。有没有办法在一个查询中实现这个解决方案?

您可以将字符串转换为 XML,然后利用 XML 类型的方法(例如 VALUE(更多信息 here)来提取所需的输出您需要的信息:

DECLARE @mockup TABLE ([DISPLAYVALUE] VARCHAR(100));

INSERT INTO @mockup
VALUES ('466500-GO-INF-ITAPPS-EMP-CLERADM')

;WITH Splitted
AS (
    SELECT  
         CAST('<x>' + REPLACE([DISPLAYVALUE], '-', '</x><x>') + '</x>' AS XML) AS Parts
    FROM @mockup
    )
SELECT
     Parts.value(N'/x[1]', 'int')         as [Main Account]
    ,Parts.value(N'/x[2]', 'varchar(50)') as [Business Unit]
    ,Parts.value(N'/x[3]', 'varchar(50)') as [Department]
    ,Parts.value(N'/x[4]', 'varchar(50)') as [Cost Center]
    ,Parts.value(N'/x[5]', 'varchar(50)') as [Asset Type]
    ,Parts.value(N'/x[6]', 'varchar(50)') as [Classification]
FROM Splitted;

结果:

第一个select语句:

SELECT  
     CAST('<x>' + REPLACE([DISPLAYVALUE], '-', '</x><x>') + '</x>' AS XML) AS Parts
FROM @mockup

将您的字符串转换成一个 XML 文档,其中包含一系列 XML 标签(名为 <x>,但您可以在此处使用任何其他内容),每个标签包含一个你的价值观:

<x>466500</x>
<x>GO</x>
<x>INF</x>
<x>ITAPPS</x>
<x>EMP</x>
<x>CLERADM</x>

现在,在第二个 select 语句中,您可以使用特定的 XML 类型运算符,例如 VALUE() 从 XML 中获取每个值并将其放在单独的专栏:

SELECT
     Parts.value(N'/x[1]', 'int')         as [Main Account]
    ,Parts.value(N'/x[2]', 'varchar(50)') as [Business Unit]
    ,Parts.value(N'/x[3]', 'varchar(50)') as [Department]
    ,Parts.value(N'/x[4]', 'varchar(50)') as [Cost Center]
    ,Parts.value(N'/x[5]', 'varchar(50)') as [Asset Type]
    ,Parts.value(N'/x[6]', 'varchar(50)') as [Classification]
FROM Splitted;

此处您使用 XQuery 从第一个 select 中创建的 XML 文档中提取单个值。

例如,要提取第一个标签的内容 <x>,您可以使用 XQuery '/x[1]' 检索第一个元素,'/x[2]' 检索第二个元素,依此类推。