#sql #sql-server #tsql #case
#sql #sql-сервер #tsql #дело
Вопрос:
Я пытаюсь написать запрос, но WHERE
предложение должно быть динамически применено, если данные поиска существуют, иначе пропустите эту часть в одном запросе.
Declare @search_text varchar(50)='', @start_date datetime, @end_date datetime; If(@search_text = '') begin select * from Table1 where CONVERT(VARCHAR(12), Mydate, 101) BETWEEN CONVERT(Date, @start_date) AND CONVERT(Date,@end_date) end else begin select * from Table1 where column1 like '%' @search_text '%' end
Я пытаюсь это сделать, но это не работает:
select * from Table1 where ( Case when ISNULL(@search_text,'') = '' Then CONVERT(VARCHAR(12), MyDate, 101) END BETWEEN CONVERT(Date, @start_date) AND CONVERT(Date,@end_date) )
Комментарии:
1. MySQL и SQL Server-это совершенно разные продукты; пожалуйста, отметьте их правильно.
2. Это для SQL Server. просто изменено
3. Примечание — ваши критерии поиска не поддаются проверке, какой тип данных соответствует вашей дате рождения ?
4. Почему вы меняете дату на
varchar
?5. Почему ваши параметры даты объявлены так, как
datetime
если бы вы, очевидно, беспокоились только о датах? Неаккуратный код провоцирует ошибки. Используйте эксклюзивную верхнюю границу даты, и вы можете безопасно игнорировать любые проблемы со временем в (предположительно) столбце даты и времени, на который вы ссылаетесь.
Ответ №1:
Вы можете объединить логику в одном запросе с помощью одного WHERE
предложения:
SELECT * FROM Table1 WHERE @search_text = '' AND CONVERT(VARCHAR(12), Mydate, 101) BETWEEN CONVERT(Date, @start_date) AND CONVERT(Date, @end_date) OR @search_text lt;gt; '' AND column1 LIKE '%' @search_text '%';