1

我正在使用数据库,其中我提取的字段之一是:

1-117 3-134 3-133

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

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

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

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

这里棘手的部分是此列可以在此处包含任意数量的集合(例如1-117 3-1331-117 3-134 3-133 2-131)。

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

谢谢你的帮助。

4

3 回答 3

1

由于您没有提供数据库供应商,因此这里有两篇文章分别为 SQL Server 和 Oracle 回答了这个问题......

T-SQL:与字符串连接相反 - 如何将字符串拆分为多条记录

在 PL/SQL 存储过程中拆分逗号分隔的字符串

如果您正在使用其他一些 DBMS,请搜索“拆分文本”。我几乎可以保证您不是第一个提出问题的人,而且每种 DBMS 风格都有答案。

正如你所说的格式是不变的,你也可以使用 SUBSTRING 函数做一些更简单的事情。

编辑以回应 OP 评论...

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

于 2012-07-12T23:39:09.410 回答
1

假设您所说的格式始终为#-###(正好是 1 位、破折号和 3 位)是正确的,这相当容易。

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 个值。

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

于 2012-07-13T04:07:34.967 回答
0

如果集合不增加超过 4,那么您可以使用 Parsename 来检索结果

 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 个,则使用拆分函数

于 2012-07-13T01:00:08.700 回答