[英]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]), '')
然后我執行此查詢以返回“-”之前的字符:
case
when charindex('-',[DISPLAYVALUE])>0
then Substring([DISPLAYVALUE], 1, Charindex('-', [DISPLAYVALUE])-1)
else [DISPLAYVALUE]
end
不幸的是,這會導致多個幫助列。 有沒有辦法在一個查詢中實現這個解決方案?
您可以實現所需的 output 將您的字符串轉換為 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]'
檢索第二個元素,依此類推。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.