sql >> データベース >  >> RDS >> Sqlserver

MS-SQL AND / ORは条件付きですか(短絡評価を実行します)?

    この動作の保証はありません。

    短絡評価の例ではない expr1 AND expr2で発生

    SET STATISTICS IO ON
    
    IF EXISTS(SELECT COUNT(*) FROM master..spt_monitor HAVING COUNT(*)=2)  
    AND EXISTS (SELECT COUNT(*) FROM master..spt_values HAVING COUNT(*)=1)
    PRINT 'Y'
    

    EXISTS(SELECT COUNT(*) FROM master..spt_monitor HAVING COUNT(*)=2) falseです (Andを意味します -ed式はFalseである必要があります )しかし、IOの結果は、2番目の条件がまだ評価されていることを示しています。

    Table 'spt_values'. Scan count 1, logical reads 14, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    Table 'spt_monitor'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    

    SQLServerはできます しかし、これを行います。これは私のテストで見られます

    SET STATISTICS IO ON
    
    DECLARE @p1 BIT = NULL
    
    IF ( @p1 = 1
         AND EXISTS(SELECT *
                    FROM   master..spt_values) )
      PRINT '1'
    
    ELSE IF ( @p1 = 0
         AND EXISTS(SELECT *
                    FROM   master..spt_values) )
      PRINT '2'
    

    出力は

    です
    Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    (1 row(s) affected)
    Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
    
    (1 row(s) affected)
    

    spt_valuesを表示しています アクセスされたことはありません。

    これは、実行プランのパススルー述語条件によって実装されます。ここにそれらに関するいくつかの情報があります。

    パススルー述語がtrueと評価された場合、結合は行を返します。パススルー述語がfalseと評価された場合、結合は正常に進行します



    1. 制約の名前がわからない場合、Oracleで非ヌル制約を削除するにはどうすればよいですか?

    2. MariaDBで1か月の日数を返す

    3. SQLite挿入

    4. CLEAR SCREEN-Oracle SQL Developerのショートカット?