首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >拆分SQL Server存储过程中的文本

拆分SQL Server存储过程中的文本
EN

Stack Overflow用户
提问于 2012-07-13 07:22:34
回答 3查看 5.3K关注 0票数 1

我正在使用一个数据库,我提取的其中一个字段类似于:

代码语言:javascript
运行
复制
1-117 3-134 3-133

这些数字集合中的每一个都代表另一个表中的不同数据集合。以1-117为例,1 =设备ID,117 =设备设置。

我有另一个表,我需要根据前面的字段从该表中提取数据。它有两列,分别用于拆分设备ID和设置。本质上,我需要一种方法从查询的列1-117开始运行查询,以便从另一个表中提取数据,其中1和117是两个单独的对应列。

那么,有没有办法拆分这个数字来运行这个查询呢?

另外,我如何将这三个数字(1-117 3-134 3-133)拆分为三个不同的查询集?

这里的棘手之处在于,这个列可以有任意数量的集合(比如1-117 3-1331-117 3-134 3-133 2-131)。

我在一个存储过程中创建这些查询,作为一个更大的文档的一部分,以显示提取的数据。

谢谢你的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-13 07:39:09

由于您没有提供DB供应商,这里有两篇文章分别针对SQL Server和Oracle回答这个问题……

T-SQL: Opposite to string concatenation - how to split string into multiple records

Splitting comma separated string in a PL/SQL stored proc

如果你正在使用其他的DBMS,去搜索“拆分文本”。我几乎可以保证您不是第一个问这个问题的人,而且每个DBMS版本都有答案。

正如您所说的,格式是恒定的,您也可以使用SUBSTRING函数来做一些更简单的事情。

编辑以响应操作注释...

由于您使用的是SQL Server,并且您说这些值始终采用一致的格式,因此您可以做一些简单的事情,如使用SUBSTRING获取值的每个部分并将其赋值给T-SQL变量,然后在T-SQL变量中使用它们来执行任何您想要的操作,比如在查询的谓词中使用它们。

票数 1
EN

Stack Overflow用户

发布于 2012-07-13 12:07:35

假设您所说的格式始终是#-#(恰好是1位数字、一个破折号和3位数字)是正确的,这是相当简单的。

代码语言:javascript
运行
复制
WITH EquipmentSettings AS (
   SELECT
      S.*,
      Convert(int, Substring(S.AwfulMultivalue, V.Value * 6 - 5, 1) EquipmentID,
      Convert(int, Substring(S.AwfulMultivalue, V.Value * 6 - 3, 3) Settings
   FROM
      SourceTable S
      INNER JOIN master.dbo.spt_values V
         ON V.Value BETWEEN 1 AND Len(S.AwfulMultivalue) / 6
   WHERE
      V.type = 'P'
)
SELECT
   E.Whatever,
   D.Whatever
FROM
   EquipmentSettings E
   INNER JOIN DestinationTable D
      ON E.EquipmentID = D.EquipmentID
      AND E.Settings = D.Settings

在SQL Server 2005+中,此查询将支持字符串中的1365个值。

如果数字的长度可以改变,那就有点难了。让我知道。

票数 1
EN

Stack Overflow用户

发布于 2012-07-13 09:00:09

如果集合的增量不超过4,则可以使用Parsename检索结果

代码语言:javascript
运行
复制
 Declare @Num varchar(20)
 Set @Num='1-117 3-134 3-133'

 select parsename(replace (@Num,' ','.'),3)

 Result :- 1-117

 Now again use parsename on the same resultset 

 Select parsename(replace(parsename(replace (@Num,' ','.'),3),'-','.'),1)

 Result :- 117

如果有4个以上的值,则使用拆分函数

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11462149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档