web-dev-qa-db-fra.com

Quel est l'équivalent de Select Case dans Access SQL?

J'ai une requête qui inclut des champs nommés openingbalance et commissions. Je voudrais calculer les valeurs pour commissions sur la base de openingbalance, semblable à ceci Select Case bloc dans 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

Mais puisque Access ne permet pas Select Case dans une requête, comment puis-je atteindre mon objectif dans Access SQL?

33
Kelly K.

Considérez le Changer de fonction comme alternative à plusieurs expressions IIf(). Il renverra la valeur de la première paire expression/valeur où l'expression est évaluée comme True et ignore toutes les paires restantes. Le concept est similaire à l'approche SELECT ... CASE À laquelle vous avez fait référence, mais qui n'est pas disponible dans Access SQL.

Si vous souhaitez afficher un champ calculé sous la forme commission:

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

Si vous souhaitez stocker cette valeur calculée dans un champ nommé commission:

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

De toute façon, voyez si vous trouvez Switch() plus facile à comprendre et à gérer. Plusieurs IIf()s peuvent devenir ahurissants à mesure que le nombre de conditions augmente.

55
HansUp

Vous pouvez utiliser IIF pour un résultat similaire.

Notez que vous pouvez imbriquer les instructions IIF pour gérer plusieurs cas. Il y a un exemple ici: 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
RedFilter

Vous pouvez faire ci-dessous:

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
Victor