在Access SQL中合并替代方案

时间:2008-10-29 18:23:52

标签: sql ms-access

在T-SQL中,您可以这样做:

SELECT ProductId, COALESCE(Price, 0)
FROM Products

你如何在Access SQL中做同样的事情?我看到在VBA中使用Nz进行的示例,但我正在寻找SQL等价物。

感谢。

6 个答案:

答案 0 :(得分:22)

Access支持Nz功能,允许您在查询中使用它。请注意,Nz与T-SQL ISNULL函数相同。它不能像COALESCE那样采用任意数量的参数。

答案 1 :(得分:16)

如果它在Access查询中,您可以尝试:

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

答案 2 :(得分:9)

看起来我可以使用:

SELECT ProductId, Nz(Price, 0)
FROM Products

似乎工作正常。

答案 3 :(得分:4)

使用Iif(Price is null, 0, Price)可以获得最佳效果(请参阅Allen Browne's performance tips)。但是,SQL Server Coalesce()具有优于Iif()Nz()的优势,它可以在级联中处理多个参数。所以我创建了这个快速的VBA等价物:

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

答案 4 :(得分:2)

使用IsNull()Nz()和数据转换函数是内置的VBA函数,只会减慢2003之前版本中的查询速度。就数据类型而言,使用{{1}保证您的数据类型,但仅当您需要进行强比较或仅在列上将format属性设置为Currency时。 IF语句最能减慢事情,因为它为你的例程增加了另一个功能

使用此解决方案:CCur()

唯一的时间Nz([Price], CCur(0))将在Price为Null时执行,因此整体而言这可能是最快的。

关键是使用的总函数数量最少,查询执行得越快。

答案 5 :(得分:-1)

COALESCE或NULLIF函数是sql server上用于良好迁移访问的标准。 ISNULLor IIF或CHOOSE是非标准功能。