我有张桌子:
CREATE TABLE [dbo].[usecase](
[id] [int] NULL,
[desc] [varchar](50) NULL,
[comm] [varchar](50) NULL,
[catgroup] [varchar](50) NULL
) ON [PRIMARY]
GO示例数据如下:
insert into usecase (id, [desc], comm, catgroup) values(1,'desc 1', 'comment 1', '1')
insert into usecase (id, [desc], comm, catgroup) values(2,'desc 2', 'comment 2', '1,2')
insert into usecase (id, [desc], comm, catgroup) values(3,'desc 3', 'comment 3', '1,2,3')
insert into usecase (id, [desc], comm, catgroup) values(4,'desc 4', 'comment 4', '60,61')
insert into usecase (id, [desc], comm, catgroup) values(5,'desc 5', 'comment 5', '59,60,61')
insert into usecase (id, [desc], comm, catgroup) values(6,'desc 6', 'comment 6', '9,3')catgroup是每个用例的类别id,它是1:n关系??一个用例可能属于多个类别。
在上述示例数据中,类别1有3个用例(1,2,3),类别2有2个用例(2,3),类别3有2个用例(3,6)等等。
我正在寻找的是一个基于类别id的查询,并返回属于这个给定类别id的所有用例。
数据库为Server 2014。
发布于 2020-02-24 23:45:02
正如最初的注释已经指出的那样,最好的解决方案是将数据规范化,这样您就拥有了一个像usecase_categories (usecase_id, category_id)这样的表,这样任何字段都不能容纳多个数据,但是如果您由于某种原因无法更改数据结构,那么这种笨拙的情况可能会起作用:
WHERE catgroup = '5' -- Is the only category
OR catgroup LIKE '5,%' -- Is the first category
OR catgroup LIKE '%,5' -- Is the last category
OR catgroup LIKE '%,5,%' -- Is somewhere in the middle of the list在这种情况下,正在寻找“类别5”,您可以进一步修改它,使其更加灵活.
WHERE catgroup = '5'
OR catgroup LIKE CAST(somecategoryid AS VARCHAR) + ',%'
OR catgroup LIKE '%,' + CAST(somecategoryid AS VARCHAR)
OR catgroup LIKE '%,' + CAST(somecategoryid AS VARCHAR) + ',%'可能也有一种使用正则表达式的方法,但实际上,您应该修复表的设计。
https://stackoverflow.com/questions/60385017
复制相似问题