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。