accesssql中的合并替代方案
在T-SQL中,可以执行以下操作:accesssql中的合并替代方案,sql,ms-access,Sql,Ms Access,在T-SQL中,可以执行以下操作: SELECT ProductId, COALESCE(Price, 0) FROM Products 如何在Access SQL中执行相同的操作?我看到了在VBA中使用Nz的例子,但我正在寻找与SQL等效的 谢谢。Access支持Nz功能,允许您在查询中使用它。请注意,Nz与T-SQLISNULL函数相同。它不能接受任意数量的参数,如COALESCEcan.如果它在Access查询中,您可以尝试以下方法: "Price = IIf([Price] Is Nu
SELECT ProductId, COALESCE(Price, 0)
FROM Products
如何在Access SQL中执行相同的操作?我看到了在VBA中使用Nz的例子,但我正在寻找与SQL等效的
谢谢。Access支持
Nz
功能,允许您在查询中使用它。请注意,Nz
与T-SQLISNULL
函数相同。它不能接受任意数量的参数,如COALESCE
can.如果它在Access查询中,您可以尝试以下方法:
"Price = IIf([Price] Is Null,0,[Price])"
看起来我可以使用:
SELECT ProductId, Nz(Price, 0)
FROM Products
似乎工作正常。使用IsNull()
,Nz()
,数据转换函数是内置的VBA函数,在2003年以前的版本中只会减慢查询速度。就数据类型而言,使用CCur()
来保证您的数据类型,但仅当您需要进行强比较或只需在列上将format属性设置为Currency时。IF语句的速度最慢,因为它为例程添加了另一个函数
使用此解决方案:Nz([Price],CCur(0))
CCur()
执行的唯一时间是Price为Null时,因此总体而言,这可能是最快的
关键是使用的函数总数越少,执行查询的速度就越快。COALESCE或NULLIF函数是sql server上用于良好迁移到access的标准函数。isNull或IIF或CHOOSE是非标准函数。使用
IIF(Price为null,0,Price)
应能提供最佳性能(请参阅)。然而,SQL ServerCoalesce()
与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
您确实需要注意参数的结果数据类型,因为它并不总是以数字形式结束。我还没有完全弄明白为什么理论上它应该选择第一个参数的数据类型。另外,在查询中使用VBA函数时要小心,因为它们可能是性能杀手。“Jet(Access背后的数据库引擎)SQL也支持Nz函数”-不正确,Jet没有Nz()函数。MS Access对象模型有一个NZ()函数,该函数只能用于MS Access接口内的查询。在MS Access接口之外使用NZ()会导致错误。由于某种原因,NZ([Field],0)更改了字段的类型(在结果集中左对齐),而IIF([Price]为null,0,[Price])工作正常。仅供参考:较新的ACE数据库引擎(取代较旧的Jet引擎)确实在本机上支持某些VBA函数,包括NZ()。我认为这相当于Access 2010及更高版本。这主要是因为ACE引擎支持直接支持的数据宏(类似于其他SQL DBMS中的触发器),即使在Access环境之外也是如此。好处是这些函数也可以在SQL查询中使用。@CPerkins,我有ACE 2010和pyODBC,我得到了“[Microsoft][ODBC Microsoft Access Driver]表达式中未定义的函数“NZ”。@CristianCiupitu我验证了NZ()不允许使用各种ODBC客户端:(。但我还验证了NZ()在其他上下文中被ACE引擎识别。考虑到在使用ODBC调用函数(如DATEPARTE)和NOW()时,会得到各种错误消息。,但我仍然得到了有效的数据。但是如果我尝试执行复合调用,ODBC会抱怨并且不允许它,即使它是非常好的SQL格式,并且允许单独使用函数。总之,nz()确实不受支持,但这只是因为ODBC不允许它通过自己的规则传递给引擎。为什么不
IIf(IsNull(Price))呢,0,Price)
?你会如何在查询中使用它?@David-W-Fenton:因为IsNull()
是VBA,思考速度慢了很多,而IsNull
是Jet&co本机处理的,请参阅我答案中艾伦·布朗页面的链接。