将一列中的值解析为另一个表中的多列

dem*_*srv 2 sql t-sql sql-server sql-server-2008

Microsoft SQL Server 2008

我有两张桌子.其中一列有一个_分隔数据

例:

Y_21_CA
<BR>
such that:
Yes/No_Age_State
Run Code Online (Sandbox Code Playgroud)

我需要解析此列中的数据并将其插入另一个表中,该表具有每个值的单独列.假设表A包含一列,如上例所示,但表B包含三列,YesOrNo, Age, usState.

最简单的方法是什么?我尝试过这样的事情:

UPDATE TableA
SET YesOrNo = SUBSTRING (TableB.Column1, 1, 1)
Run Code Online (Sandbox Code Playgroud)

SUBSTRING只是表达.我真的只需要一些指导,我一直在试图解决这个问题,因为我不是一个SQL大师.我可以弄清楚语法没有问题,但也许我不知道存在一些方法.谢谢

Kaf*_*Kaf 5

一个通用的解决方案,使用Charindex'_'而不对其进行硬编码

declare @s varchar(10) = 'Y_21_CA'   

SELECT LEFT(@s, CHARINDEX('_',@s,1)-1) YN, 
       SUBSTRING(@s, CHARINDEX('_',@s,1)+1,  
                 CHARINDEX('_',@s,CHARINDEX('_',@s,1)) ) Age,
       RIGHT(@s, CHARINDEX('_',reverse(@s),1)-1) State 

--Results
Y   21   CA
Run Code Online (Sandbox Code Playgroud)

如果您希望在其他查询中经常使用此逻辑,则可以将SELECT语句设置为内联TVF.然后你就可以将它与你的更新一起使用,如下所示:

UPDATE b
SET YesOrNo = x.YN,
    Age = x.Age,
    State = x.State
FROM TableB b
INNER JOIN TableA a ON b.ID = a.ID
CROSS APPLY ThreeColumnSplit(a.S) x;
Run Code Online (Sandbox Code Playgroud)

这是SQL Fiddle"实时"演示.(请不要介意它使用SQL Server 2012引擎.这只是因为Fiddle的2008实例目前似乎已关闭而无法使用.脚本中没有特定于SQL Server 2012的内容.)