2016-01-29 1 views
1

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

@keyword1 varchar(100) = null 
@keyword2 varchar(100) = null 
@keyword3 varchar(100) = null 
@keyword4 varchar(100) = null 
@keyword5 varchar(100) = null 

SELECT supplier_code 

FROM crm_cache 

WHERE (@keyword1 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword1 + '%')) 
    OR (@keyword2 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword2 + '%')) 
    OR (@keyword3 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword3 + '%')) 
    OR (@keyword4 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword4 + '%')) 
    OR (@keyword5 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword5 + '%')) 

Он работает и возвращает правильно, когда все пять ключевых слов, которые были приняты и не пусты, но если поставить ключевые слова 1 и 2, оставляя 3,4 и 5 по умолчанию нулевое значение. Возвращенные данные являются массивными и неверными.

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

@keyword1 varchar(100) = 'ruby' 
@keyword2 varchar(100) = 'silver cross' 
@keyword3 varchar(100) = null 

SELECT supplier_code 

FROM crm_cache 

WHERE (@keyword1 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword1 + '%')) 
    OR (@keyword2 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword2 + '%')) 

, но с пунктом, который имеет нулевую переменную как ключевое слово 3, я получаю сотни строк возвращены

Как я должен реализовать такой запрос, который имеет необязательные параметры для сравнения с одним столбцом?

Должен ли я использовать Содержит вместо LIKE?

Вы видите, где моя логика неверна в условиях?

ответ

2
@keyword1 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword1 + '%') 
  • если @keyword1 является NULL, то все условие будет справедливо независимо от других проверок, так как это все OR с. То же самое для всех других переменных.

Вам нужно это:

@keyword1 IS NOT NULL AND crm_cache.search_string LIKE ('%' + @keyword1 + '%') 

... для каждой переменной, объединяются вместе с OR как сейчас. Но логика должна заключаться в том, что хотя бы один из параметров не является нулевым и соответствует входу.

+0

Кажется, что нужно работать. Не могу поверить, что это было так просто. –

4

Ваша логика правильная, но не совсем то, что вы хотите. Если вы использовали AND, то было бы хорошо:

WHERE (@keyword1 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword1 + '%')) AND 
     (@keyword2 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword2 + '%')) AND 
     (@keyword3 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword3 + '%')) AND 
     (@keyword4 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword4 + '%')) AND 
     (@keyword5 IS NULL OR crm_cache.search_string LIKE ('%' + @keyword5 + '%')) 

Но это не то, что вы хотите. Я думаю, вы можете просто оставить вне NULL сравнения:

WHERE (crm_cache.search_string LIKE ('%' + @keyword1 + '%')) OR 
     (crm_cache.search_string LIKE ('%' + @keyword2 + '%')) OR 
     (crm_cache.search_string LIKE ('%' + @keyword3 + '%')) OR 
     (crm_cache.search_string LIKE ('%' + @keyword4 + '%')) OR 
     (crm_cache.search_string LIKE ('%' + @keyword5 + '%')) 

Когда один из ключевых слов NULL, то пункты возврата NULL (который рассматривается как не-правда). Однако, если они верны, то OR вернет true. Это логика, которую вы хотите.

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