2017-05-31 7 views
0

Ich habe dieses Stück Code:SQL - Verwendung von CASE und OR in SELECT WHEN

SELECT 
    'Type1' AS TYPE 
    ,1500 AS TotalBalance 
    ,0 AS OverdueBal 
INTO #temp1 


SELECT 

    CASE 
     WHEN 
      (TYPE = 'Type1' AND TotalBalance BETWEEN 1301 AND 5000) OR 
      (TYPE = 'Type2' AND TotalBalance >= 1301) AND 
      OverdueBal > 100 THEN 'Category1' 
    END 
    ,* 
FROM 
    #temp1 

Was ich nicht verstehe ist, warum diese CASE Aussage ergibt TRUE?
Die Reihe erfüllt die erste Bedingung in den geschweiften Klammern, aber sie erfüllt nicht den AND Zustand.
Wenn ich die zweite geschweifte Klammernbedingung lösche, dann funktioniert es so, wie es sollte, geben NULL als Ergebnis.
Es scheint mir, dass es die Zahnspange ignoriert.

Antwort

3

Ihre Klammern sind nicht vollständig:

SELECT (CASE WHEN ((TYPE = 'Type1' AND TotalBalance BETWEEN 1301 AND 5000) OR 
        (TYPE = 'Type2' AND TotalBalance >= 1301) 
       ) AND 
        (OverdueBal > 100) 
      THEN 'Category1' 
     END) 

Ihre Version wird analysiert, wie:

SELECT (CASE WHEN (TYPE = 'Type1' AND TotalBalance BETWEEN 1301 AND 5000) OR 
        ((TYPE = 'Type2' AND TotalBalance >= 1301) AND 
        (OverdueBal > 100) 
       ) 
      THEN 'Category1' 
     END) 

Das ist, wie AND und OR analysiert werden. Sie sollten Klammern verwenden, um sicherzustellen, dass der Ausdruck so ausgewertet wird, wie Sie es beabsichtigen.