从数据库获取值仅返回1行

时间:2016-09-05 15:51:00

标签: sql sql-server

我正在尝试执行此查询:

SELECT * FROM Table1 where '1018' in (Content)

这是Table1上的内容:

enter image description here

虽然我的查询只返回第二条记录。

不应该归还所有记录吗?

3 个答案:

答案 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%'