我开始知道在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
只是我主查询中的一个子查询。
答案 0 :(得分:0)
IIF
为BOOLEAN
返回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
。我假设该区域的记录不会太多,以致查询速度变慢。
Nz
与ISNULL
类似。
这有帮助吗?