在每一个定界符出现的地方分割字符串。

问题描述 投票:0回答:1

我需要在每个定界符出现的地方将这个字符串分割成多个字段,如下图所示。

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]), '')

然后我执行这个查询来返回"-"之前的字符。

case

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

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

else [DISPLAYVALUE]

end

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

sql sql-server-2012 jet
1个回答
1
投票

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

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;

结果:

Result grid

第一条选择语句:

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>

现在在第二条选择语句中,你可以使用特定的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从第一次选择创建的XML文档中提取一个值。

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

© www.soinside.com 2019 - 2024. All rights reserved.