2014-02-14 3 views
2

Для таблицы с колонкой КОЛ, как VARCHAR (х), как я должен переписать это условиеИНЕК на NULLABLE столбцов, с указанной LIKE, продолжайте использование индекса

ColA LIKE @param + '%' 

, принимая во внимание, что:

  • 1/ColA - NULLable.
  • 2/@param может быть NULL
  • 3/Существует индекс по COLA, и она должна быть использована для всех поисков
  • 4/Избегайте sp_executesql, так как это является частью гораздо большей хранимой процедуры

Я думал на:

ISNULL(ColA, '') LIKE (CASE WHEN @param IS NULL THEN '%' ELSE @param + '%' END)   

, но это не будет использовать индекс, определенный на COLA.

+1

Если @param имеет нулевое значение, должны строки, где КОЛА является нулевой быть вернулся? То есть, следует считать «равным»? – Bohemian

+0

@Bohemian: да, NULL следует считать «равными» – user3104183

+2

«В ColA есть индекс, и он должен использоваться для всех поисков» - ну, этого не будет. Условие 'LIKE' с личным шаблоном может * не использовать индекс. –

ответ

0

Просто используйте:

WHERE ((@param is NULL) and (ColA is NULL)) OR (ColA LIKE '%' + @param + '%') 

Но если вы используете LIKE '%' + @param + '%' индекс не может быть использован (если он не полнотекстовый индекс):

- SQL Server Index - Any improvement for LIKE queries?

- Index usage by %Like% operator – Query Tuning

+0

он не будет возвращать строки в случае, если ColA имеет значение NULL ... – user3104183

+0

Он вернет ColA = NULL, только если @param - NULL. – valex

+0

Нет, он не будет возвращать каждую строку, когда параметр равен нулю – Bohemian

1

Разделить на два условия:

... 
WHERE ((@param is null AND ColA is null) 
    OR (@param IS NOT NULL AND ColA LIKE @param + '%')) 

Но OR часто убивает использование индекса, так что если это не сработает, попробуйте дальнейший раскол в два запроса:

... 
WHERE @param is null 
AND ColA is null 
UNION 
... 
WHERE @param IS NOT NULL 
AND ColA LIKE @param + '%' 

Но

+0

Я думаю, что второе условие '@param IS NOT NULL' бесполезно. В случае '@ param = NULL' мы получаем' ColA LIKE NULL', и это всегда FALSE. – valex

+0

@valex * логически * это может быть необязательно, но * производительность * может быть намного больше с ним, потому что весь поиск LIKE можно избежать, если параметр равен null. С дополнительным тестом он может выполнить подобное в любом случае (в зависимости от оптимизатора) – Bohemian

+0

Я согласен, что это зависит от оптимизатора. – valex

Смежные вопросы