Vraag Wat is het equivalent van Select Case in Access SQL?


Ik heb een vraag die velden met de naam bevat openingbalance en commissies. Ik zou waarden willen berekenen voor commissies gebaseerd op openingbalance, vergelijkbaar hiermee Select Case blokkeren in Access VBA:

Select Case OpeningBalance
   Case 0 To 5000
        commission = 20
   Case 5001 To 10000
        commission = 30
   Case 10001 To 20000
        commission = 40
   Case Else
        commission = 50
End Select

Maar aangezien Access het niet toestaat Select Case in een query, hoe kan ik mijn doel bereiken in Access SQL?


27
2018-04-02 20:50


oorsprong


antwoorden:


Houd rekening met de Schakel functie als een alternatief voor meerdere IIf() uitdrukkingen. Het retourneert de waarde van het eerste expressie / waarde-paar waar de expressie wordt geëvalueerd als True en negeert eventuele resterende paren. Het concept is vergelijkbaar met de SELECT ... CASE aanpak waarnaar u verwijst maar die niet beschikbaar is in Access SQL.

Als u een berekend veld wilt weergeven als commission:

SELECT
    Switch(
        OpeningBalance < 5001, 20,
        OpeningBalance < 10001, 30,
        OpeningBalance < 20001, 40,
        OpeningBalance >= 20001, 50
        ) AS commission
FROM YourTable;

Als u die berekende waarde wilt opslaan in een veld met de naam commission:

UPDATE YourTable
SET commission =
    Switch(
        OpeningBalance < 5001, 20,
        OpeningBalance < 10001, 30,
        OpeningBalance < 20001, 40,
        OpeningBalance >= 20001, 50
        );

Hoe dan ook, kijk of je het vindt Switch() gemakkelijker te begrijpen en te beheren. Meerdere IIf()s kan verbijsterend worden naarmate het aantal condities groeit.


44
2018-04-02 23:59



U kunt IIF gebruiken voor een vergelijkbaar resultaat.

Merk op dat u de IIF-instructies kunt nesten om meerdere zaken af ​​te handelen. Er is hier een voorbeeld: http://forums.devshed.com/database-management-46/query-ms-access-iif-statement-multiple-conditions-358130.html

SELECT IIf([Combinaison] = "Mike", 12, IIf([Combinaison] = "Steve", 13)) As Answer 
FROM MyTable;

5
2018-04-02 20:53



Je zou het hieronder kunnen doen:

select
iif ( OpeningBalance>=0 And OpeningBalance<=500 , 20, 

                  iif ( OpeningBalance>=5001 And OpeningBalance<=10000 , 30, 

                       iif ( OpeningBalance>=10001 And OpeningBalance<=20000 , 40, 

50 ) ) ) as commission
from table

1
2018-04-02 20:55