如何在 SQL 查询中动态跳过没有 If else 的 where 子句?

Posted

技术标签:

【中文标题】如何在 SQL 查询中动态跳过没有 If else 的 where 子句?【英文标题】:How to skip where clause without If else in SQL query dynamically? 【发布时间】:2022-01-11 12:36:35 【问题描述】:

我正在尝试编写查询,但如果存在搜索数据,则需要动态应用 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) )

【问题讨论】:

mysql 和 SQL Server 是完全不同的产品;请正确标记。 适用于 SQL Server。刚刚修改 注意 - 您的搜索条件不是 sargable,您的 Mydate 是什么数据类型? 为什么要将日期转换为varchar 当您显然只关心日期时,为什么将日期参数声明为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 <> '' AND column1 LIKE '%' + @search_text + '%';

【讨论】:

以上是关于如何在 SQL 查询中动态跳过没有 If else 的 where 子句?的主要内容,如果未能解决你的问题,请参考以下文章

如何进行 Hive SQL IF/ELSE 查询?

用于sql查询的IF、ELSE语句

如何在 SQL 中编写 if else if 条件 |甲骨文 |

在 sql 查询中使用 if/else

如果表不存在,如何运行包含针对另一个 sql 实例上的表的查询的 If-Then-Else 语句?

在oracle sql语句里有没有if...else...的用法,请各位大侠给个例子看看,灰常感谢!!