我有一个表,其中有很多列(> 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
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
...
更具可读性,但速度慢得多。有没有更清洁的方法可以做到这一点?
IF仅影响WITH
部分,但我不能将IF放在WITH
内。此外,如果不是NULL,则字段的唯一用法是通过
WHERE col1 = @value1
等'
是否有一种更清洁的方法?这是所有值都存在时使用的WITH
的示例:
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>
谢谢
答案 0 :(得分:1)
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子句。我会以最佳方式进行更多挖掘。但是最简单的就是这个
答案 1 :(得分:0)
这是我发现的清除代码的方法。
我们写了一个通用的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
。