Использование LIKE в рамках CASE в TSQL - PullRequest
2 голосов
/ 11 ноября 2011

Я хотел бы выбрать записи, которые содержат содержимое параметра @selctDescription, но только когда @selctDescription не пусто.

У меня есть следующее, которое не работает:

(t.[description] LIKE 
  (
  CASE 
  WHEN @selctDescription = '' THEN t.[description] 
  ELSE ('%' @selctDescription '%') 
  END
  )
)

Может кто-нибудь указать мне правильное направление?

Ответы [ 5 ]

4 голосов
/ 11 ноября 2011
SELECT * 
FROM Table
WHERE 
  ((@selctDescription IS NULL OR @selctDescription = '') 
   OR
   (t.[description] LIKE '%' + @selctDescription +'%'))
2 голосов
/ 11 ноября 2011

Пара мыслей для тебя ...

Если у вас есть '%' @selctDescription '%', вам просто нужно + между строками, чтобы объединить их. Ваш код будет работать как есть.

  • '%' + @selctDescription + '%'

1012 *
*

Также полезно отметить, что вам даже не нужен оператор CASE, так как, когда параметр пуст, вы получаете '%%', который все равно будет соответствовать всему.


Это полезно знать, потому что в настоящее время у вас есть поля таблицы по обе стороны от оператора LIKE. Это действительно повредит оптимизатору. Если бы я использовал CASE, у меня было бы больше искушения придерживаться ...

t.[description] LIKE (CASE WHEN @selctDescription = '' THEN '%' ELSE ('%' + @selctDescription + '%') END)

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


И, тем не менее, оно становится функционально идентичным ...

t.[description] LIKE ('%' + @selctDescription + '%')
2 голосов
/ 11 ноября 2011

Я думаю, что ваш код эквивалентен:

t.[description]  LIKE  '%' + @selctDescription + '%' 

С другой стороны, ваше описание предполагает, что вы хотите это:

@selctDescription <> ''
AND t.[description]  LIKE  '%' + @selctDescription + '%' 
2 голосов
/ 11 ноября 2011
@selctDescription = '' OR t.[description] LIKE '%' + @selctDescription + '%'
1 голос
/ 11 ноября 2011

Исходя из вашей первой строки и комментариев, вам нужно сделать следующее:

Select * from table
  where field <> ''
  and field like '%' + @selctDescription + '%'

Но вы должны поставить правильные таблицы и поля , а @selctDesciption должен быть текстом (char, nchar, varchar, nvarchar, ...).

...