2012-12-14 56 views
4

可能重複:
CASE equivalent of a nested IIF statementMS-Access查詢到T-SQL

我想下面的Access查詢到T-SQL轉換,但我有問題與IIF聲明。

Access查詢

SELECT 
qry_LAB_LOAD_Prequery2.Asset AS SITE_REF, 
Format([Det],"00000") AS DET_, 
IIf(IsNull([MT]),"0",IIf(Right([SP_Ref],2)="WZ" 
And IsNull([LabLoadFileSuffix_MT]) 
And [MT]>0,CStr([MT]) & "CT",CStr([MT]) & [LabLoadFileSuffix_MT])) AS MT_COUNT, 
IIf(IIf(IsNull([MT]),0,[MT])>=IIf(IsNull([IM]),0,[IM]),0, 
IIf(IsNull([IM]),"0",IIf(Right([SP_Ref],2)="WZ" 
And IsNull([LabLoadFileSuffix_IM]),CStr([IM]) 
& "CT",CStr([IM]) & [LabLoadFileSuffix_IM]))) AS IM_COUNT, 
qry_LAB_LOAD_Prequery2.[2012 Sample Point] AS SP_REF, qry_LAB_LOAD_Prequery2.Area 
FROM qry_LAB_LOAD_Prequery2 
WHERE (((IIf(IsNull([IM]),0,[IM])+IIf(IsNull([MT]),0,[MT]))>0)); 

我試着它的一部分轉換。任何人都可以幫助我糾正嵌套的IID語句,因爲我不確定。

SQL查詢

SELECT qry_LAB_LOAD_Prequery2.Asset AS SITE_REF, 
RIGHT('00000' + CAST([Det] AS VARCHAR(5)),5) AS DET_, 
    ----- (the nested iff statements) 
qry_LAB_LOAD_Prequery2.[2012 Sample Point] AS SP_REF, 
qry_LAB_LOAD_Prequery2.Area 
FROM qry_LAB_LOAD_Prequery2 
where (ISNull([IM],0) + ISNULL([MT],0)) > 0 

回答

3

要轉換嵌套IIF需要用戶案例。

讓我們第一個:

Reformating我得到:

IIf(
      IsNull([MT]), 
      "0", 
        IIf(Right([SP_Ref],2)="WZ" 
          And IsNull([LabLoadFileSuffix_MT]) 
          And [MT]>0, 

         CStr([MT]) & "CT", 
         CStr([MT]) & [LabLoadFileSuffix_MT] 
        ) 
    ) AS MT_COUNT, 

其轉換爲:

CASE 
WHEN [MT] IS NULL 
    THEN "0", 
ELSE 
    CASE 
     WHEN Right([SP_Ref],2) = "WZ" 
      AND ([LabLoadFileSuffix_MT] IS NULL 
       AND [MT]>0 
     THEN 
      CAST([MT] AS VARCHAR) + "CT" 
     ELSE 
      CAST([MT] AS VARCHAR) + [LabLoadFileSuffix_MT] 
    END 
END AS MT_COUNT, 

這簡化爲:

CASE 
WHEN [MT] IS NULL 
    THEN "0", 
ELSE 
    CAST([MT] AS VARCHAR) 
    + CASE 
     WHEN Right([SP_Ref],2) = "WZ" 
      AND ([LabLoadFileSuffix_MT] IS NULL 
       AND [MT]>0 
     THEN 
      "CT" 
     ELSE 
      [LabLoadFileSuffix_MT] 
    END 
END AS MT_COUNT, 

對於三通第二一個我改革tted,然後將其轉換爲下面

CASE WHEN 

    CASE 
     WHEN [MT] IS NULL THEN 0 
     ELSE [MT] 
    END 

    >= 

    CASE 
     WHEN [IM] IS NULL THEN 0 
     ELSE [IM] 
    END , 

THEN 0, 
ELSE  

    CASE 
     WHEN [IM] IS NULL THEN "0" 
     ELSE 

     CASE 
      WHEN Right([SP_Ref],2) = "WZ" AND [LabLoadFileSuffix_IM] IS NULL THEN CAST([IM] AS VARCHAR) + "CT" 
      ELSE CAST([IM] AS VARCHAR) + [LabLoadFileSuffix_IM] 
     END 
     END 
END 
AS IM_COUNT, 

Whick降低到

CASE 
     WHEN ISNULL([MT], 0) > = ISNULL([IM], 0) 
THEN 0, 
ELSE  
    CASE 
     WHEN [IM] IS NULL THEN "0" 
     ELSE 
     CAST([IM] AS VARCHAR) + 
     CASE 
      WHEN Right([SP_Ref],2) = "WZ" AND [LabLoadFileSuffix_IM] IS NULL THEN "CT" 
      ELSE [LabLoadFileSuffix_IM] 
     END 
     END 
END 
AS IM_COUNT, 

基本上歸結爲2兩週非常類似的表達。

+0

感謝Preet。關於第二條iff聲明的任何想法? – user1483122

+0

我也轉換了第二個。 –

1

嘗試嵌套的case語句。

因此,只要把你的線的第一個2:

IIf(IsNull([MT]),"0",IIf(Right([SP_Ref],2)="WZ" 
And IsNull([LabLoadFileSuffix_MT]) 

將成爲

CASE WHEN MT IS NULL 
THEN 0 
ELSE 
    CASE WHEN RIGHT(SP_Ref, 2) = "WZ" AND LabLoadFileSuffix_MT IS NULL 
    THEN 
     ... 
    ELSE ... 
    END 
END