2

微软 SQL 服务器 2008

我有两张桌子。其中有一列,其中包含_分隔的数据

例子:

Y_21_CA
<BR>
such that:
Yes/No_Age_State

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

最简单的方法是什么?我试过做类似的事情:

UPDATE TableA
SET YesOrNo = SUBSTRING (TableB.Column1, 1, 1)

SUBSTRING只需要一个表达式。我真的只需要一些指导,因为我不是 SQL 专家,所以我一直在努力解决这个问题。我可以弄清楚语法没有问题,但也许我不知道存在一些方法。谢谢

4

2 回答 2

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

如果您希望在其他查询中经常使用此逻辑,您可以使 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;

这是SQL Fiddle 的“现场”演示。(请不要介意它使用 SQL Server 2012 引擎。那只是因为 Fiddle 的 2008 实例目前似乎已关闭并且无法使用。脚本中没有特定于 SQL Server 2012 的内容。)

于 2013-01-03T22:16:14.187 回答
2

您应该能够使用以下内容,我认为您想要一个INSERT而不是UPDATE.

SELECT获取数据的语句是:

select substring(yourCol, 1, 1) YesOrNo,
  substring(yourcol, 3, len(yourcol)-5) Age,
  right(yourCol, 2) usState
from tableA;

请参阅带有演示的 SQL Fiddle

那么INSERT声明是:

insert into tableB (YesOrNo, Age, usState)
select substring(yourCol, 1, 1) YesOrNo,
  substring(yourcol, 3, len(yourcol)-5) Age,
  right(yourCol, 2) usState
from tableA;

请参阅带有演示的 SQL Fiddle

注意:这假定YesOrNo列总是只有一个字符,并且usState总是有 2 个字符。

于 2013-01-03T22:09:24.403 回答