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。