web-dev-qa-db-fra.com

coalesce alternative dans Access SQL

Dans T-SQL, vous pouvez faire ceci:

SELECT ProductId, COALESCE(Price, 0)
FROM Products

Comment faites-vous la même chose dans Access SQL? Je vois des exemples pour le faire avec Nz dans VBA, mais je cherche l'équivalent SQL.

Merci.

31
Nathan DeWitt

Access prend en charge la fonction Nz et vous permet de l'utiliser dans une requête. Notez cependant que Nz est identique à la fonction T-SQL ISNULL. Il ne peut pas accepter un nombre arbitraire de paramètres comme COALESCE.

21
pipTheGeek

S'il se trouve dans une requête Access, vous pouvez essayer ceci:

"Price = IIf([Price] Is Null,0,[Price])"
17
Codewerks

On dirait que je peux simplement utiliser:

SELECT ProductId, Nz(Price, 0)
FROM Products

Semble fonctionner très bien.

8
Nathan DeWitt

L'utilisation de Iif(Price is null, 0, Price) devrait vous donner les meilleures performances (voir Astuces de performance d'Allen Browne ). Cependant, SQL Server Coalesce() a le grand avantage sur Iif() et Nz() qu'il peut gérer plusieurs paramètres en cascade. J'ai donc créé cet équivalent VBA rapide:

Function Coalesce(ParamArray varValues()) As Variant
'returns the first non null value, similar to SQL Server Coalesce() function
'Patrick Honorez --- www.idevlop.com
    Dim i As Integer
    Coalesce = Null
    For i = LBound(varValues) To UBound(varValues)
        If Not IsNull(varValues(i)) Then
            Coalesce = varValues(i)
            Exit Function
        End If
    Next
End Function
6
Patrick Honorez

L'utilisation de IsNull(), Nz() et les fonctions de conversion de données sont des fonctions VBA intégrées et ne ralentiront vos requêtes que dans les versions antérieures à 2003. Pour le typage des données, utilisez la fonction CCur() pour garantir votre type de données, mais uniquement si vous devez effectuer des comparaisons solides ou simplement définir la propriété format sur Devise dans la colonne. C'est l'instruction IF qui ralentit le plus les choses, car elle ajoute encore une autre fonction à votre routine

en utilisant cette solution: Nz([Price], CCur(0))

le seul moment où CCur() s'exécutera, c'est lorsque Price Is Null, donc dans l'ensemble c'est probablement le plus rapide.

Le fait est que le moins de fonctions totales utilisées, plus vos requêtes s'exécuteront rapidement.

1
Art Mendenhall