将 Access SQL IIF 转换为 T-SQL CASE 语句



我有其他人的 Access 查询,我需要将其转换为 T-SQL。 我已经完成了大部分工作。 接下来的两行是我的问题。 这是访问 SQL:

...
, [MATERIALVALUE]/1000 AS COSTOURS
...
, IIf([ALLJOBS].[SALESID]="SUI",[COSTOURS]=0,IIf([PRICE]=-1,[COSTOURS]=0,[COSTOURS])) AS COST0
...

第一线COSTOURS很简单。 它只是

...
,MATERIALVALUES/1000 COSTOURS
...

我遇到的问题是COSTOURS在后面的同一SELECT语句的CASE语句中的设置以及COST0的设置是什么?

我的 T-SQL 案例语句是这样的:

,CASE AllJobs.SALESID
WHEN 'SUI' THEN COSTOURS = 0
ELSE CASE ESSDBtRels.PRICE
WHEN -1 THEN COSTOURS = 0
ELSE ESSDBtRels.MATERIALVALUE/1000
END
END COST0

这显然不起作用。 如何根据后续 CASE 语句的真实属性使用新结果设置先前设置的列。 在 TRUE 和 FALSE 的情况下,COST0 被设置为什么? 一个假的,假的将把成本0设置为成本。

谢谢@forpas,由于材料价值没有影响,我将使用以下SQL:

CASE AllJobs.SALESID
WHEN 'SUI' THEN 0
ELSE CASE ESSDBtRels.PRICE
WHEN 1 THEN 0
ELSE ESSDBtRels.MATERIALVALUE/1000
END
END COST0

在 MS Access 中,像[COSTOURS]=0这样的布尔表达式被评估为TRUE-1FALSE0
因此,要获得相同的结果,您应该使用 CASE 语句来代替这些表达式:

CASE AllJobs.SALESID
WHEN 'SUI' THEN CASE ESSDBtRels.[MATERIALVALUE] WHEN 0 THEN -1 ELSE 0 END
ELSE CASE ESSDBtRels.PRICE
WHEN -1 THEN CASE ESSDBtRels.[MATERIALVALUE] WHEN 0 THEN -1 ELSE 0 END
ELSE ESSDBtRels.MATERIALVALUE/1000
END
END COST0

或带IIF()

IIF(
[ALLJOBS].[SALESID]='SUI',
IIF(ESSDBtRels.MATERIALVALUE=0, -1, 0),
IIf(
[PRICE]=-1,
IIF(ESSDBtRels.MATERIALVALUE=0, -1, 0),
ESSDBtRels.MATERIALVALUE/1000
)
) AS COST0

最新更新