我需要在每个定界符出现的地方将这个字符串分割成多个字段,如下图所示。
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
不幸的是,这将导致多个辅助列。有没有一种方法可以在一次查询中实现这种解决方案?
您可以实现所需的输出,将您的字符串转换为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;
结果:
第一条选择语句:
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]'
为第二种,以此类推。