在MSSQL过滤器中,基于ID的行在列中以逗号分隔的字符串

时间:2016-04-25 15:25:28

标签: sql sql-server sql-server-2008

我像这样基准测试表

BMID      TestID     BMTitle    ConnectedTestID
---------------------------------------------------
1          5         My BM1          0
2          6         My BM2          5
3          7         My BM3          5,6
4          8         My BM4          10,12,8
5          9         My BM5          0
6          10        My BM6          3,6
7          5         My BM7          8,3,12,9
8          3         My BM8          7,10
9          8         My BM9          0
10         12        My BM10         9
---------------------------------------------

稍微解释一下表

这里TestID和连接的TestID正在扮演角色。如果用户想要TestID 3的所有基准

它应该返回testID = 3的行以及任何具有connectTestID列的行,其中包含逗号分隔值中的testID

这意味着如果用户将值3指定为testID,则应返回

---------------------------------------------
8          3         My BM8          7,10
7          5         My BM7          8,3,12,9
6          10        My BM6          3,6
--------------------------------------------

希望清楚这三行是如何返回的。意味着第一行是因为testID 3在那里。另外两行因为3在其connectedIDs单元格中

1 个答案:

答案 0 :(得分:5)

您应该修复数据结构。在逗号分隔的列表中存储数字ID是一个坏的,坏的,坏主意:

  • SQL Server没有最好的字符串操作功能。
  • 将编号存储为字符串是一个坏主意。
  • 拥有未声明的外键关系是一个坏主意。
  • 生成的查询无法使用索引。

在探索联结表的内容时,您可以解决数据结构的问题,可以使用如下查询:

where testid = 3 or
      ',' + ConnectedTestID + ',' like '%,3,%'