我在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和替换函数,但我不太确定如何将它们绑在一起。谢谢。
答案 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
<强>返回强>
答案 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