【问题标题】:Convert Access SQL IIF to T-SQL CASE statement将 Access SQL IIF 转换为 T-SQL CASE 语句
【发布时间】:2019-12-09 21:17:51
【问题描述】:

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

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

第一行 COSTOURS 很简单。只是

...
,MATERIALVALUES/1000 COSTOURS
...

我遇到的问题是稍后在同一 SELECT 语句的 CASE 语句中设置 COSTOURS 以及 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、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

【问题讨论】:

    标签: sql-server tsql ms-access case


    【解决方案1】:

    在 MS Access 中,像 [COSTOURS]=0 这样的布尔表达式被评估为 -1 用于 TRUE0 用于 FALSE
    因此,要获得相同的结果,您应该使用 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
    

    【讨论】:

    • 哦,所以每个 IIF 的 TRUE 部分实际上并未将 COSTOURS 重置为 0?
    • 不,他们不是。
    猜你喜欢
    • 2020-11-23
    • 1970-01-01
    • 2020-01-24
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多