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

标签 sql sql-server sql-server-2008 tsql

微软 SQL Server 2008

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

例子:

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 专家,所以我一直在用头撞墙试图解决这个问题。我可以毫无问题地弄清楚语法,但也许我不知道存在的某些方法。谢谢

最佳答案

一个通用的解决方案,使用 '_' 的 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;

这是一个 "live" demo at SQL Fiddle . (请不要介意它使用 SQL Server 2012 引擎。那只是因为 Fiddle 的 2008 实例目前似乎已关闭且无法使用。脚本中没有任何特定于 SQL Server 2012 的内容。)

关于sql - 将一列中的值解析为另一个表中的多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14147899/

相关文章:

sql - 在具有日期限制的 SQL 记录中搜索

sql - 将数据插入到sql server服务代理的队列中

sql-server - SQL:将多行结果显示为 1 行

mysql - 在 Derby DB 中插入触发器之前

Python SQL - 两个左连接

mysql - 如何向包含前一列百分比的 select 语句添加额外列

sql-server - Sql Server行大小限制和表设计

sql - 通过隐藏列进行分组 - SQL

sql-server - 如何批量插入所有值都用双引号引起来的 csv?

mysql - Where 子句似乎不起作用