【发布时间】:2010-09-19 20:34:44
【问题描述】:
在 T-SQL 中,您可以这样做:
SELECT ProductId, COALESCE(Price, 0)
FROM Products
您如何在 Access SQL 中做同样的事情?我在 VBA 中看到了使用 Nz 执行此操作的示例,但我正在寻找 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])"
【讨论】:
IIf(IsNull(Price), 0, Price)?
IsNull() 是 VBA 并且会慢下来思考很多,而 Is Null 由 Jet & co 本地处理,请参阅我的回答中指向 Allen Browne 页面的链接。
看起来我可以使用:
SELECT ProductId, Nz(Price, 0)
FROM Products
似乎工作得很好。
【讨论】:
使用IsNull()、Nz(),并且数据转换函数是内置的 VBA 函数,只会减慢 2003 之前版本的查询速度。就数据类型而言,使用 CCur() 来保证您的数据类型,但仅当您需要进行强比较或仅在列上将格式属性设置为 Currency 时。最慢的是 IF 语句,因为它为您的例程添加了另一个功能
使用此解决方案:Nz([Price], CCur(0))
CCur() 将执行的唯一时间是价格为 Null 时,因此总体而言这可能是最快的。
关键是使用的函数总数越少,查询执行的速度就越快。
【讨论】:
COALESCE 或 NULLIF 函数是 sql server 上用于良好迁移访问的标准。 ISNULL 或 IIF 或 CHOOSE 是非标准函数。
【讨论】:
使用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 Long
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
【讨论】: