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 に答える