在每次出现分隔符时拆分字符串
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]'
检索第二个元素,依此类推。
我需要在出现每个分隔符时将此字符串拆分为多个字段,如下所示:
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]'
检索第二个元素,依此类推。