Tsql 将Access SQL IIF转换为T-SQL CASE语句
我需要将其他人的访问查询转换为T-SQL。我基本上都做完了。下面这两行是我的问题。这是Access SQL:Tsql 将Access SQL IIF转换为T-SQL CASE语句,tsql,ms-access,Tsql,Ms Access,我需要将其他人的访问查询转换为T-SQL。我基本上都做完了。下面这两行是我的问题。这是Access SQL: ... , [MATERIALVALUE]/1000 AS COSTOURS ... , IIf([ALLJOBS].[SALESID]="SUI",[COSTOURS]=0,IIf([PRICE]=-1,[COSTOURS]=0,[COSTOURS])) AS COST0 ... 第一行成本很简单。只是 ... ,MATERIALVALUES/1000 COSTOURS ... 我
...
, [MATERIALVALUE]/1000 AS COSTOURS
...
, IIf([ALLJOBS].[SALESID]="SUI",[COSTOURS]=0,IIf([PRICE]=-1,[COSTOURS]=0,[COSTOURS])) AS COST0
...
第一行成本很简单。只是
...
,MATERIALVALUES/1000 COSTOURS
...
我遇到的问题是在同一SELECT语句的CASE语句中稍后设置COSTURES,以及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属性,使用新结果设置先前设置的列。那么,在一个真实的、虚假的、真实的场合,COST0设置为什么呢?一个FALSE,FALSE会将COST0设置为COSTOURS
谢谢@forpas,因为MATERIALVALUE与以下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
计算为-1
,对于FALSE
计算为0
因此,为了得到相同的结果,您应该使用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的真实部分实际上并没有将成本重置为0?不,它们不是。
IIF(
[ALLJOBS].[SALESID]='SUI',
IIF(ESSDBtRels.MATERIALVALUE=0, -1, 0),
IIf(
[PRICE]=-1,
IIF(ESSDBtRels.MATERIALVALUE=0, -1, 0),
ESSDBtRels.MATERIALVALUE/1000
)
) AS COST0