If statement 清理3个嵌套SQL`IF..ELSE`检查值是否为NULL,用于`WHERE…AND`
我有一个列数大于50的表。我正在编写一个存储过程,其中用户希望在其他参数中传入3个可选参数来过滤数据集。通常我的代码看起来像If statement 清理3个嵌套SQL`IF..ELSE`检查值是否为NULL,用于`WHERE…AND`,if-statement,with-statement,sql-server-2017,If Statement,With Statement,Sql Server 2017,我有一个列数大于50的表。我正在编写一个存储过程,其中用户希望在其他参数中传入3个可选参数来过滤数据集。通常我的代码看起来像 IF @value1 IS NULL IF @value2 IS NULL IF @value3 IS NULL WITH...SELECT ELSE WITH...SELECT ELSE IF @value3 IS NULL WITH...SELECT EL
IF @value1 IS NULL
IF @value2 IS NULL
IF @value3 IS NULL
WITH...SELECT
ELSE
WITH...SELECT
ELSE
IF @value3 IS NULL
WITH...SELECT
ELSE
WITH...SELECT
ELSE
IF @value2 IS NULL
IF @value3 IS NULL
WITH...SELECT
ELSE
WITH...SELECT
ELSE
IF @value3 IS NULL
WITH...SELECT
ELSE
WITH...SELECT
但这似乎很混乱,而且很复杂,特别是因为WITH相对较大
或者
IF @value1 IS NULL AND
@value2 IS NULL AND
@value3 IS NULL
WITH..SELECT
ELIF @value1 IS NULL AND
@value2 IS NULL AND
WITH..SELECT
ELIF ...
WITH..SELECT
ELIF ...
WITH..SELECT
...
更具可读性,但速度要慢得多。有没有更干净的方法
IFs只影响WITH部分,但我不能在WITH中添加IF。此外,字段(如果不为NULL)的唯一用法是通过
其中col1=@value1等'
有没有更干净的方法?以下是当所有值都存在时使用的示例:
WITH trans AS
(
SELECT *
FROM myTable
WHERE myKey = '12345'
AND col1 = @value1
AND col2 = @value2
AND col3 = @value3
)
SELECT *
FROM trans
WHERE <additional criteria not dependent on @values>
感谢where子句中的用例。一个案例有多个,然后就可以了。 另一种粗糙的方法可能是这样的:
DECLARE @value1 as nvarchar(max),
@value2 as nvarchar(max),
@value3 as nvarchar(max)
declare @whereClause as nvarchar(max) = Select case when @value1 is null and @value2 IS NULl and @value3 is null then 'where clause 1'
when @value1 is null and @value2 IS NOT NULl and @value3 is NOT null then 'where clause 2'
else ''
使用where子句。我会挖更多的来寻找最好的方法。但最简单的方法是这样的这是我发现的清理代码的方法 我们编写了一个通用WHERE子句,如下所示
WHERE myKey = '12345'
AND (@value1 IS NULL OR col1 = @value1)
AND (@value2 IS NULL OR col2 = @value2)
AND (@value3 IS NULL OR col3 = @value3)
然后就不需要嵌套IF了。+1谢谢您的尝试。但在性能方面,这与我的案例2中的案例2有什么不同吗?案例2使用IF..ELIF..ELSE进行这种构造?似乎条件将按顺序计算,因此@value1 IS NULL可能会计算8次?嵌套IFs系统似乎更好,没有什么比一次评估更有效。我希望有一个更好的解决方案,例如,允许创建这些WHERE..AND子句,我正在以更好的方式使用这些值