【问题标题】:How to use Joins in IIF() function and how to use select statement inside nested IIF () in MSAccess query?如何在 IIF() 函数中使用 Joins 以及如何在 MSAccess 查询的嵌套 IIF() 中使用 select 语句?
【发布时间】:2017-08-29 17:35:25
【问题描述】:

我知道不能在 Ms-access 查询中使用 case 表达式。相反,必须使用 IIF() 函数。我有一个 MS SQL 查询,它需要转换为一个预先存在的旧旧版应用程序的 Ms-access 查询。我知道 IIF() 函数的一般语法;但是,我有两个表相互连接的复杂案例表达式。你们有人能帮我吗?

CASE 
    WHEN ISNULL(tblDetail.ProductDiscPct,0)<>0 THEN 'MFG'
        WHEN EXISTS (
            SELECT 1 FROM ORDER_Shipment os 
            JOIN [ORDER_Items] oi 
            ON os.OrderId = oi.orderid 
            AND oi.MaterialId = tblDetail.MaterialID
            AND ISNULL(oi.ItemStatusId,0)=0
            AND oi.OrderItemTypeId = 300 
            AND [tblDetail].[Quantity] = [oi].[Qty]
            WHERE CAST(tblInvoice.ARInvID AS varchar) = os.InvNumber
            ) 
        THEN 'SPECIAL'
    ELSE ''
END AS LnNote

这是我需要转换为 MS-access 查询的 MS SQL 查询,我尝试如下但没有给我任何结果,相反它带走了我在中字段的控制源的下拉选项访问报告。

IIf(IsNull(qryDetail.ProductDiscountPct &lt;&gt; 0, "MFG", "" )) AS LnNote

这只是我一直在努力工作的案例陈述的第一行。 qryDetail 只是我主查询中的一个子查询。

【问题讨论】:

  • 可以不嵌套IIF吗?
  • @shahkalpesh:是的,我可以,但我很难嵌套 IFF,而且我只是一个初学者。

标签: sql-server ms-access case iif-function


【解决方案1】:

IIFms-access 返回一个BOOLEAN,因此请检查ISNULL 是否为真,如果是则将其设置为0 或自身。然后检查该值与 0 的比较并返回 MFG 或 ""。

IIF(IIF(IsNull(qryDetail.ProductDiscountPct),0,qryDetail.ProductDiscountPct) &lt;&gt; 0,"MFG","") AS LnNote

【讨论】:

  • 谢谢@scsimon 我要试试这个。但我仍然有一些嵌套的部分。即WHEN EXISTS ( SELECT 1 FROM ORDER_Shipment os JOIN [ORDER_Items] oi ON os.OrderId = oi.orderid AND oi.MaterialId = tblDetail.MaterialID AND ISNULL(oi.ItemStatusId,0)=0 AND oi.OrderItemTypeId = 300 AND [tblDetail].[Quantity] = [oi].[Qty] WHERE CAST(tblInvoice.ARInvID AS varchar) = os.InvNumber )
  • @toofaced 然后你可以用你的子查询替换 ""
  • 好的。我认为这是我的最后一个选择,因为最初我通过创建子查询开始处理它,这给了我在“JOIN”语句之后突出显示所有错误
【解决方案2】:
IIF(Nz(tblDetail.ProductDiscPct,0) <> 0, "MFG", 
    IIF((SELECT COUNT(*) FROM ORDER_Shipment os 
    JOIN [ORDER_Items] oi 
    ON os.OrderId = oi.orderid 
    AND oi.MaterialId = tblDetail.MaterialID
    AND ISNULL(oi.ItemStatusId,0)=0
    AND oi.OrderItemTypeId = 300 
    AND [tblDetail].[Quantity] = [oi].[Qty]
    WHERE CAST(tblInvoice.ARInvID AS varchar) = os.InvNumber) > 0, "SPECIAL", "")
) AS LnNote

这是您在 SQL 中的粗略翻译。 此外,它使用COUNT(*) 而不是EXISTS。我假设该区域的记录不会太多,从而使查询变慢。

Nz 类似于ISNULL

这有帮助吗?

【讨论】:

  • 我认为 MS-access 不喜欢 IIF 语句中的 select 语句。它向我抛出了一条错误消息Syntax error. in query expression 'IIF(NX(qry.....)' . Tried different ways a) removed aliased. b)give nice square parenthesis in every alias. Both of them didn't work. Also, I think access doesn't understand the word JOIN`,所以我使用了INNER JOIN
  • 它是Nz,而不是Nx。您在哪里看到语法错误?
  • 抱歉,这是一个错字,我使用了 'Nz',它将整个 select 语句突出显示为语法错误。我也曾尝试为该选择部分创建一个“子查询”,但对于子查询它也给了我错误。
  • 将您的整个查询发布在原始问题中,以便理解语法错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多