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

San*_*mas 2 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
---------------------------------------------
Run Code Online (Sandbox Code Playgroud)

稍微解释一下表

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

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

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

---------------------------------------------
8          3         My BM8          7,10
7          5         My BM7          8,3,12,9
6          10        My BM6          3,6
--------------------------------------------
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*off 5

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

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

当您正在探索联结表是什么,以便您可以解决数据结构的问题时,您可以使用如下查询:

where testid = 3 or
      ',' + ConnectedTestID + ',' like '%,3,%'
Run Code Online (Sandbox Code Playgroud)

  • @sforsandeep - 然后我强烈建议你的老板创建累积技术债务的日志.因为像这样的决定经常可以下雪 - 在可维护性,显着的性能损失等方面等等. (3认同)