【问题标题】:coalesce alternative in Access SQLAccess SQL 中的合并替代方案
【发布时间】:2010-09-19 20:34:44
【问题描述】:

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

SELECT ProductId, COALESCE(Price, 0)
FROM Products

您如何在 Access SQL 中做同样的事情?我在 VBA 中看到了使用 Nz 执行此操作的示例,但我正在寻找 SQL 等效项。

谢谢。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

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

    【讨论】:

    • “Jet(Access 背后的数据库引擎)SQL 也支持 Nz 函数” - 不正确,Jet 没有 NZ() 函数。 MS Access 对象模型有一个 NZ() 函数,只能在 MS Access 接口内的查询中使用。在 MS Access 接口之外使用 NZ() 会导致错误。
    • 由于某种原因 NZ([Field], 0) 更改了字段的类型(在结果集中左对齐),而 IIF([Price] 为空,0,[Price])运行良好.
    • 仅供参考:较新的 ACE 数据库引擎(旧 Jet 引擎的替代品)确实支持某些 VBA 函数,包括 Nz()。我认为这对应于 Access 2010 及更高版本。这主要是必要的,因为 ACE 引擎支持直接支持的数据宏(类似于其他 SQL DBMS 中的触发器),即使在 Access 环境之外也是如此。好处是这些函数在 SQL 查询中也可用。
    • @CPerkins,我有带有 pyODBC 的 ACE 2010,我得到“[Microsoft][ODBC Microsoft Access Driver] Undefined function 'NZ' in expression”。
    • @CristianCiupitu 我使用各种 ODBC 客户端验证了 Nz() 不允许 :(。但我还验证了 Nz() 在其他上下文中被 ACE 引擎识别. 考虑到我在使用 ODBC 调用 DatePart() 和 Now() 等函数时收到各种错误消息, 但我仍然得到有效数据. 但是如果我尝试执行复合调用, ODBC 会抱怨并且不允许它即使它是非常好的 SQL 格式,并且单独允许函数。总而言之,确实不支持 nz(),但这只是因为 ODBC 不允许通过自己的规则将其传递给引擎。
    【解决方案2】:

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

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

    【讨论】:

    • 为什么不IIf(IsNull(Price), 0, Price)
    • 你将如何在查询中使用它?
    • @David-W-Fenton:因为IsNull() 是 VBA 并且会慢下来思考很多,而 Is Null 由 Jet & co 本地处理,请参阅我的回答中指向 Allen Browne 页面的链接。
    【解决方案3】:

    看起来我可以使用:

    SELECT ProductId, Nz(Price, 0)
    FROM Products
    

    似乎工作得很好。

    【讨论】:

    • 您确实需要注意参数的结果数据类型,因为它并不总是在您期望的时候以数字结尾。我从来没有完全弄清楚为什么,尽管理论上,它应该选择第一个参数的数据类型。
    • 另外,在查询中使用 VBA 函数时要小心,它们可能会成为性能杀手。
    【解决方案4】:

    使用IsNull()Nz(),并且数据转换函数是内置的 VBA 函数,只会减慢 2003 之前版本的查询速度。就数据类型而言,使用 CCur() 来保证您的数据类型,但仅当您需要进行强比较或仅在列上将格式属性设置为 Currency 时。最慢的是 IF 语句,因为它为您的例程添加了另一个功能

    使用此解决方案:Nz([Price], CCur(0))

    CCur() 将执行的唯一时间是价格为 Null 时,因此总体而言这可能是最快的。

    关键是使用的函数总数越少,查询执行的速度就越快。

    【讨论】:

      【解决方案5】:

      COALESCE 或 NULLIF 函数是 sql server 上用于良好迁移访问的标准。 ISNULL 或 IIF 或 CHOOSE 是非标准函数。

      【讨论】:

        【解决方案6】:

        使用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
        

        【讨论】:

          猜你喜欢
          • 2011-12-29
          • 1970-01-01
          • 2010-09-18
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 2022-01-25
          • 1970-01-01
          相关资源
          最近更新 更多