2

我开始知道不能在 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 <> 0, "MFG", "" )) AS LnNote

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

4

2 回答 2

0

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

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

于 2017-04-04T14:01:51.693 回答
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. 我假设该区域的记录不会太多,以免使查询变慢。

Nz类似于ISNULL

这有帮助吗?

于 2017-04-04T14:37:58.250 回答