Я пытаюсь выполнить этот запрос:

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

И это содержание на Table1:

enter image description here

Хотя мой запрос возвращает только вторую запись.

Не должен ли он возвращать все записи?

-1
Sora 5 Сен 2016 в 18:50

3 ответа

Лучший ответ

В вашем запросе сейчас указано where '1018' in (Content)

Посмотрите содержание:

1018,1020,1021

Вы говорите where '1018' in '1018,1020,1021', что это

Переверните его, используйте LIKE, и он будет работать (и будет в 1000 раз эффективнее)

where CONTENT LIKE '%1018%'
0
JohnHC 5 Сен 2016 в 15:55

Согласно комментариям вам нужно разделить список через запятую и использовать значения. Что-то вроде этого.

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)
1
Alex Kudryashev 5 Сен 2016 в 17:00

Это слишком долго для комментария.

Вы сохраняете числовые значения в виде списка, разделенного запятыми. Это действительно плохая идея. У вас должна быть таблица с одной строкой на ContentId.

Иногда мы застреваем в действительно плохих дизайнерских решениях других людей. В этом случае вы можете использовать like:

SELECT t.*
FROM Table1 t
WHERE ',' + Content + ',' LIKE '%,' + '1018' + ',%';

Запятые гарантируют, что '10' не соответствует '1018'.

Примечание: этот формат исключает использование индексов, поэтому, надеюсь, ваша таблица не слишком большая.

1
Gordon Linoff 5 Сен 2016 в 19:09