1

次のコードは 'First' と 'Second' の INSERT を出力するので、最初に満たされた条件が常に実行されると結論付けることができますか?

DECLARE @Constant1 int = 1
DECLARE @Constant2 int = 2

select 
     case 
          when @Constant1 = 1 
               then 'First'
          when @Constant1 = 1  and @Constant2 = 2
               then 'Second'               
     end as Result

select 
     case 
          when @Constant1 = 1  and @Constant2 = 2
               then 'Second'                    
          when @Constant1 = 1 
               then 'First'

     end as Result     

並列処理が結果に影響を与える場合があることを知っており、本番環境で見られるこのタイプの状況が常に同じ結果を返すかどうかを理解しようとしていました。

この質問は、製品コードに潜在的な問題があるかどうかを理解することを目的としています。もし私がコードを新たに書くつもりなら、コードを明示的に相互に排他的にしようとするだろう..

select 
     case 
          when @Constant1 = 1 and @Constant2 != 2
               then 'First'

          when @Constant1 = 1  and @Constant2 = 2
               then 'Second'                    

     end as Result     
4

1 に答える 1

4

状態のドキュメントCASE

検索された CASE 式:

  • 指定された順序で、各 WHEN 句の Boolean_expression を評価します。
  • TRUE と評価される最初の Boolean_expression の result_expression を返します。
  • どの Boolean_expression も TRUE と評価されない場合、データベース エンジンは、ELSE 句が指定されている場合は else_result_expression を返し、ELSE 句が指定されていない場合は NULL 値を返します。

したがって、最初の真のブランチが返されます。

質問のような単純なクエリの場合、他のブランチも評価しないと予想されます。

この短絡動作が期待/宣伝どおりに機能しないいくつかのケースについては、この DBA サイトの質問で説明されています。

最初の引数が NULL でない場合でも、SQL Server はすべての COALESCE 関数を読み取りますか?

ただし、これらの問題は結果の左から右への優先順位には影響しません (後の分岐を評価するとエラーが発生し、結果がまったく返されない場合を除きます)。

于 2013-10-21T16:23:30.050 に答える