【问题标题】:Split string at each occurrence of delimiter在每次出现分隔符时拆分字符串
【发布时间】:2020-08-11 13:51:46
【问题描述】:

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

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 tsql sql-server-2012 jet


    【解决方案1】:

    您可以将您的字符串转换为 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 文档(命名为 &lt;x&gt;,但您可以在这里使用其他任何东西),每个标记都包含您的值之一:

    <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 从第一次选择中创建的 XML 文档中提取单个值。

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

    【讨论】:

    • Andrea,我不熟悉 XML。你能解释一下这两个 SELECT 语句吗?
    • @amcneil206 当然,我添加了一些细节来解释每个选择中发生的情况。希望这有助于阐明一些问题。
    猜你喜欢
    • 2017-09-08
    • 2014-10-08
    • 2019-02-08
    • 2021-12-08
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多