Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 将Access SQL IIF转换为T-SQL CASE语句_Tsql_Ms Access - Fatal编程技术网

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

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 ... 我

我需要将其他人的访问查询转换为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
...
我遇到的问题是在同一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