Access SQL中的合并替代

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

SELECT ProductId, COALESCE(Price, 0) FROM Products 

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

谢谢。

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

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

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

看起来像我可以使用:

 SELECT ProductId, Nz(Price, 0) FROM Products 

似乎工作得很好。

使用Iif(Price is null, 0, Price)应该会给你最好的性能(请参阅Allen Browne的性能提示 )。 但是,SQL Server Coalesce()Iif()Nz() Coalesce()具有很大的优势,它可以处理级联中的多个参数。 所以我创build了这个快速的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 

使用IsNull()Nz()和数据转换函数是内置的VBA函数,只会减慢你的查询在2003年之前的版本。就datatyping去使用CCur()来保证你的数据types,但只如果您需要进行较强的比较,或者只需将列属性设置为货币即可。 IF语句最大限度地减缓了事情,因为它为您的例程增添了另一个function

使用这个解决scheme: Nz([Price], CCur(0))

CCur()将执行的唯一时间是价格为空时,所以这可能是最快的。

重点是使用的函数总数最less ,查询执行的速度就会越快。

COALESCE或NULLIF函数是在sql server上使用的一个很好的迁移访问标准。 ISNULLor IIF或CHOOSE是非标准function。