SQL Case и LIKE в предложении where

Я ломал голову над этой надеждой, что это возможно

declare @locationType varchar(50);
declare @SearchTerm NVARCHAR(100);

SELECT column1, column2
FROM whatever
WHERE
CASE @locationType
    WHEN 'location' THEN account_location LIKE @SearchTerm
    WHEN 'area' THEN Area LIKE @SearchTerm
    WHEN 'division' THEN xxx_location_division LIKE @SearchTerm
END

Я скопировал код из другого связанного сообщения здесь.

Я получаю сообщение об ошибке:

Неправильный синтаксис рядом с ключевым словом LIKE.


person Deeptechtons    schedule 28.11.2011    source источник


Ответы (2)


declare @locationType varchar(50);
declare @SearchTerm NVARCHAR(100);

SELECT column1, column2
FROM whatever
WHERE
   (@locationType = 'location' AND account_location LIKE @SearchTerm)
OR
   (@locationType = 'area' AND Area LIKE @SearchTerm)
OR
   (@locationType = 'division' AND xxx_location_division LIKE @SearchTerm)

Убедитесь, что @SearchTerm начинается с / заканчивается на % -> или используйте '%' + @SearchTerm + '%'.

Дополнительная информация об операторе LIKE.

--- Обновлять ----

SELECT column1, column2
FROM whatever
WHERE
(
  CASE @locationType
     WHEN 'location' THEN account_location
     WHEN 'area' THEN Area
     WHEN 'division' THEN xxx_location_division
  END
) LIKE @SearchTerm
person Francois    schedule 28.11.2011
comment
так LIKE, WHERE И CASE не идут вместе? Вы также имели в виду, что начинается с / и заканчивается на %, верно? - person Deeptechtons; 28.11.2011
comment
да, моя ошибка ==. Если вы ищете места, где указано NEW, тогда @SearchTerm должно быть NEW%. - person Francois; 28.11.2011
comment
@FrancoisB. Shocking не выбирает действительные записи местоположения с помощью этого запроса. - person Deeptechtons; 28.11.2011
comment
CASE нельзя использовать для возврата критерия поиска (например, account_location LIKE @SearchTerm). Это, как я предполагаю, БД анализирует / понимает ваш запрос. См. Мой обновленный ответ. - person Francois; 28.11.2011

Если вам не нужно проверять промежуточную строку, вы можете сделать трюк, как показано ниже:

SELECT column1, column2 
FROM whatever 
WHERE @SearchTerm LIKE 
CASE @locationType 
    WHEN 'location' THEN account_location
    WHEN 'area' THEN Area 
    WHEN 'division' THEN xxx_location_division 
END

Или вы можете сделать что-то вроде:

SELECT column1, column2 
FROM whatever 
WHERE 
   (@locationType = 'location' AND account_location LIKE @SearchTerm) 
OR 
   (@locationType = 'area' AND Area LIKE @SearchTerm) 
OR 
   (@locationType = 'division' AND xxx_location_division LIKE @SearchTerm)
person Upendra Chaudhari    schedule 28.11.2011
comment
поиск в столбце i основан на @searchtype. не упоминается здесь явно, но @locationType - используемая здесь переменная - person Deeptechtons; 28.11.2011
comment
поэтому здесь вы можете заменить переменную @locationType на searchType. - person Upendra Chaudhari; 28.11.2011