我正在尝试执行此查询:
SELECT * FROM Table1 where '1018' in (Content)
这是Table1
上的内容:
虽然我的查询只返回第二条记录。
不应该归还所有记录吗?
答案 0 :(得分:1)
评论太长了。
您将数值存储为逗号分隔列表。这是一个非常糟糕的主意。你应该有一个每ContentId
行一行的表。
有时,我们会遇到其他人非常糟糕的设计决策。在这种情况下,您可以使用like
:
SELECT t.*
FROM Table1 t
WHERE ',' + Content + ',' LIKE '%,' + '1018' + ',%';
逗号确保'10'
与'1018'
不匹配。
注意:此格式排除了索引的使用,因此希望您的表格不会太大。
答案 1 :(得分:1)
根据评论,您必须拆分逗号分隔列表并使用值。这样的事情。
declare @tbl table(id int,content varchar(100))
insert @tbl values
(1,'1018'),
(2,'1018,1020'),
(3,'1021,1018,1022'),
(4,'1019')
--elaborate a little more
declare @val varchar(10)='1018'
;with cte as (
select id, cast('<s>'+ replace(content,',','</s><s>')+'</s>' as xml) content
from @tbl
)
select t.* from @tbl t
inner join cte on t.id=cte.id
cross apply cte.content.nodes('s[.=sql:variable("@val")]') x(v)
答案 2 :(得分:0)
您的查询目前指出where '1018' in (Content)
看内容:
1018,1020,1021
你说的是where '1018' in '1018,1020,1021'
将它转过来,使用LIKE它会起作用(效率提高1000倍)
where CONTENT LIKE '%1018%'