Подстановочные знаки SQL не возвращают данные? - PullRequest
2 голосов
/ 04 августа 2010

У меня есть оператор выбора, который используется в сетке с помощью хранимой процедуры:

SELECT * FROM T_Computer WHERE (ISTag LIKE '%' + @ISTag + '%') AND Status <> 'Trashed' AND Status <> 'Sold' AND Status <> 'Stored'

@ISTag, nchar определяется значением текстового поля, если текстовое поле пустое, у меня есть значение по умолчаниюзначение установлено в%, что, по моему мнению, должно по существу сводить на нет ту часть предложения where и возвращать все строки, кроме тех, которые отменяются в столбце Status.Вместо этого он ничего не возвращает.Если я удаляю «+ @ISTag +», он делает то, что я хочу.

В основном три% ничего не возвращают, а 2% возвращают то, что я хочу.Как мне это исправить?

Ответы [ 4 ]

4 голосов
/ 04 августа 2010

Вот альтернатива, оставляя значение по умолчанию параметра @ISTag равным NULL

SELECT * 
FROM T_Computer 
WHERE (@ISTag IS NULL OR (ISTag LIKE '%' + @ISTag + '%')) 
AND Status <> 'Trashed' 
AND Status <> 'Sold' 
AND Status <> 'Stored'
3 голосов
/ 04 августа 2010

Я действительно заинтригован этим. Для начала я выполнил эти два запроса к таблице с 13221 строками и получил каждую строку в первом экземпляре и примерно половину из них во втором:

declare @rad char(30)
select @rad = '%'

select count(*) from xofdoc where docdesc like '%%%'
select count(*) from xofdoc where docdesc like '%' + @rad + '%'

С другой стороны, если я изменю объявление @rad на varchar (30), оба запроса вытянут все строки.

Причина, по которой я об этом говорю, заключается в том, что может быть что-то, что происходит с объявлением данных вашего @IsTag. Вы не сказали, как это было объявлено. Это важно, потому что char - это строка фиксированной длины, что означает, что char (5), например, со значением '%' будет иметь значение '% '. Таким образом, утверждение '%' + '% ' + '%' оценивается как: '%% %'. Таким образом, он будет искать только те строки, которые имеют по крайней мере четыре последовательных пробела в столбце «где бы то ни было». С другой стороны, varchar является элементом переменной длины, и завершающие пробелы игнорируются, что приводит к '%%%' в приведенном выше случае и, таким образом, подстановочным знакам для всего столбца.

Отредактировано для добавления : nchar или char, в этом случае нет никакой разницы. Если вы сейчас используете nchar, измените его на nvarchar.

0 голосов
/ 04 августа 2010

Проблема в том, что два последовательных символа процента (%%) заставляют его совпадать с буквенным символом «%». Таким образом, 3 последовательных значения означают «соответствует символу процента и любым последующим символам».

Как указывает LittleBobby, не используйте «%» в качестве значения по умолчанию для нулей.

0 голосов
/ 04 августа 2010

Вашу% метку% экранировали? вы не получите то, что вы ожидаете, если поиск соответствует буквальному символу%.

также нет необходимости использовать% для пустого поля. %% должен возвращать те же результаты, что и %%%.

...