如何在IIF()函数中使用Joins以及如何在MSAccess查询中使用嵌套IIF()内的select语句?

时间:2017-04-04 13:24:42

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

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

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访问查询的MS SQL查询,我尝试如下但没有给我任何结果,而是它带走了控制源的下拉选项中的字段访问报告。

IIf(IsNull(qryDetail.ProductDiscountPct <> 0, "MFG", "" )) AS LnNote

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

2 个答案:

答案 0 :(得分:0)

IIFBOOLEAN返回ms-access,因此请检查ISNULL是否为真,如果是,则将其设置为0或其自身。然后检查该值与0比较并返回MFG或&#34;&#34;。

IIF(IIF(IsNull(qryDetail.ProductDiscountPct),0,qryDetail.ProductDiscountPct) <> 0,"MFG","") AS LnNote

答案 1 :(得分:0)

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。我假设该区域的记录不会太多,以致查询速度变慢。

NzISNULL类似。

这有帮助吗?