2

在 T-SQL 中是否有一个可行的替代方法来替代嵌套的 IF ELSE 进行比较,其中必须根据比较结果进行不同的逻辑?我的情况是选择一个表示评估条件的 nvarchar 值,并根据条件进行评估。我最初试图在 CASE 声明中实现这一点,如下所示:

SELECT
            CASE @condition
            WHEN  '<' THEN

                IF (@processing_time < @threshold_value)
                BEGIN
                    SET @condition_met = 1 --compare threshold_value and processing_time
                END

            WHEN '<=' THEN
                    IF (@processing_time <= @threshold_value)
                    BEGIN
                        SET @condition_met = 1 --compare threshold_value and processing_time
                    END
                WHEN '>' THEN
                    IF (@processing_time > @threshold_value)
                    BEGIN
                        SET @condition_met = 1 --compare threshold_value and processing_time
                    END
                WHEN '>=' THEN
                    IF (@processing_time >= @threshold_value)
                    BEGIN
                        SET @condition_met = 1 --compare threshold_value and processing_time
                    END
                WHEN '=' THEN
                    IF (@processing_time = @threshold_value)
                    BEGIN
                        SET @condition_met = 1 --compare threshold_value and processing_time
                    END
            END -- end case statement

但是,根据我在其他地方看到的情况和我得到的语法错误,case 语句中的 WHEN 子句似乎只能赋值,不能执行评估逻辑。我能想到的唯一选择是使用嵌套的 IF/ELSE 语句执行等效逻辑。有没有更好的办法?重新设计表/数据类型是一种选择。

4

3 回答 3

4

我这里没有数据库来检查这个语法没有错别字但是应该这样做..

set @condition_met = (SELECT 
                        CASE WHEN (@condition = '<' AND @processing_time < @threshold_value) OR
                                  (@condition = '<=' AND @processing_time <= @threshold_value) OR
                                  (@condition = '>' AND @processing_time > @threshold_value) OR
                                  (@condition = '>=' AND @processing_time >= @threshold_value) OR
                                  (@condition = '=' AND @processing_time = @threshold_value) 
                             THEN 1 ELSE 0 END)

或者,您可以简单地执行一系列IF语句来执行相同的操作,例如

SET @condition_met = 0;
IF @condition = "<" AND @processing_time < @threshold_value SET @condition_met = 1;
IF @condition = "<=" AND @processing_time <= @threshold_value SET @condition_met = 1;
etc..
于 2012-12-18T19:36:11.243 回答
2
SELECT @Condition_Met = CASE 
            WHEN (@condition = '<' AND @processing_time < @threshold_value) OR
                 (@condition = '<=' AND @processing_time <= @threshold_value) OR
                 (@condition = '>' AND @processing_time > @threshold_value) OR
                 (@condition = '>=' AND @processing_time >= @threshold_value) OR
                 (@condition = '=' AND @processing_time = @threshold_value) 
                 THEN 1 ELSE 0 END 

在我看来,您正在尝试编写太多的程序代码,而没有足够的基于集合或声明性的代码。我有一种感觉,这整个事情属于一个更大的查询的一部分,这样你甚至不需要声明其中的一些变量。

于 2012-12-18T19:41:38.017 回答
0

还要考虑动态 SQL 解决方案。

declare @op varchar(5) = '>'
declare @sql nvarchar(max) = 
'declare @condition_met bit
declare @processing_time int = 7
declare @threshold_value int = 6

select @condition_met = case when @processing_time'+@op+'@threshold_value then 1 else 0 end
select @condition_met'
exec (@sql)

如果表达式在WHERE子句中并且或者@processing_time或者@threshold_value是索引列并且您真的想在其上使用索引,则它可能很有用。

于 2012-12-18T19:58:26.397 回答