在SQL中将单行varchar拆分为多个

时间:2017-10-13 20:37:25

标签: sql-server tsql

我在SQL Server 2008中有一个nvarchar列,其中包含逗号分隔列表中的数据,如下所示:

NM=John, AD=994 Fake Avenue, CY=Las Vegas, ST=NV, ZC=85144, ZX=1299, RAD=994 Fake Avenue, RCY=Las Vegas, RST=NV, RZC=85144, RZX=1299, BD=1/1/2001

我需要在SQL中将各个元素分解为单个变量,这样我就可以输出这样的地址:

Residence Address:
994 Fake Avenue
Las Vegas NV 85114

Mailing Address:
994 Fake Avenue
Las Vegas NV 85114

邮寄地址是AD,CY,ST,ZC和ZX。住宅是RAD,RCY,RST,RZC,RZX。我只想要地址信息。字符串中提到的其他字段我不关心,例如BD =或NM =。只有我想要删除的特定地址字段。

我认为我需要使用ltrim,rtrim和替换函数,但我不太确定如何将它们绑在一起。谢谢。

3 个答案:

答案 0 :(得分:1)

由于您是在2008年,因此您没有内置SPLIT_STRING功能,因此您需要使用this之类的内容编写自己的内容。

在逗号上拆分字符串并将结果存储到表中。拆分等号上的每个子字符串以获取您的标识符和值对,并将它们插入到辅助表中。从那里,使用case语句来确定您正在查看的值,并组装它们以构建您的地址。

答案 1 :(得分:1)

另一种选择是使用一点XML

示例

Declare @YourTable table (ID int, SomeCol varchar(max))
Insert Into @YourTable values
(1,'NM=John, AD=994 Fake Avenue, CY=Las Vegas, ST=NV, ZC=85144, ZX=1299, RAD=994 Fake Avenue, RCY=Las Vegas, RST=NV, RZC=85144, RZX=1299, BD=1/1/2001')


Select  ID
       ,NM = XMLData.value('row[1]/@NM[1]','varchar(max)')
       ,AD = XMLData.value('row[1]/@AD[1]','varchar(max)')
       ,CY = XMLData.value('row[1]/@CY[1]','varchar(max)')
       ,ST = XMLData.value('row[1]/@ST[1]','varchar(max)')
       ,ZC = XMLData.value('row[1]/@ZC[1]','varchar(max)')
       ,RAD = XMLData.value('row[1]/@RAD[1]','varchar(max)')
       ,RCY = XMLData.value('row[1]/@RCY[1]','varchar(max)')
       ,RST = XMLData.value('row[1]/@RST[1]','varchar(max)')
       ,RZC = XMLData.value('row[1]/@RZC[1]','varchar(max)')
       ,RZX = XMLData.value('row[1]/@RZX[1]','varchar(max)')
       ,BD  = XMLData.value('row[1]/@BD[1]','varchar(max)')
 From (
        Select ID
              ,XMLData=cast('<row '+replace(replace(SomeCol,'=','="'),', ','" ')+'"/>' as xml)
         From @YourTable
      ) A

<强>返回

enter image description here

答案 2 :(得分:0)

这里的挑战是将这些值分成可用的东西。以下是使用Jeff Moden字符串拆分器轻松完成此操作的方法。你可以在这里找到分离器。 http://www.sqlservercentral.com/articles/Tally+Table/72993/

然后我们需要使用条件聚合和一些字符串操作来完成此操作。下面的代码会将其解析为您要查找的每个值的列。并且它们在您的字符串中出现的顺序无关紧要。如果一行没有值,则只返回NULL。

declare @Something table
(
    SomeValue varchar(500)
)

insert @Something select 'NM=John, AD=994 Fake Avenue, CY=Las Vegas, ST=NV, ZC=85144, ZX=1299, RAD=994 Fake Avenue, RCY=Las Vegas, RST=NV, RZC=85144, RZX=1299, BD=1/1/2001'
;

with FirstParse as
(
    select ltrim(split.Item) as Item
    from @Something s
    cross apply dbo.DelimitedSplit8K(s.SomeValue, ',') split
)
, ParsedValues as
(
    select Property = left(fp.Item, charindex('=', fp.Item) - 1)
        , Value = substring(fp.Item, charindex('=', fp.Item) + 1, len(fp.Item))
    from FirstParse fp
)

select Name = max(case when Property = 'NM' then Value end)
    , ResidenceAddress = max(case when Property = 'AD' then Value end)
    , ResidenceCity = max(case when Property = 'CY' then Value end)
    , ResidenceState = max(case when Property = 'ST' then Value end)
    , ResidenceZip = max(case when Property = 'ZC' then Value end)
    , Address = max(case when Property = 'RAD' then Value end)
    , City = max(case when Property = 'RCY' then Value end)
    , State = max(case when Property = 'RST' then Value end)
    , Zip = max(case when Property = 'RZC' then Value end)
from ParsedValues