SQL вложенная функция IIF - PullRequest
       29

SQL вложенная функция IIF

1 голос
/ 11 марта 2020

Я пытаюсь сделать сложную формулу в SQL с вложенной функцией IIF. В этой формуле много IFF. Но почему-то запрос Microsoft не будет принимать оператор: enter image description here

SELECT

IIF (system_Machine.Machine_omschrijving IN ('BE'),
IIF (PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width is NULL,
IIF (PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth is NULL, PD_FleeceRecipe.FleeceRecipe_IntermediateLayer2Width, PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth)
,
IIF(PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth is NULL,
IIF(PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width is NULL, PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth, PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width)
,
PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth-PD_FleeceRecipe.FleeceRecipe_IntermediateLayer2Width+PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width-PD_FleeceRecipe.FleeceRecipe_IntermediateLayer2Width)
)))
[res] ,

PD_Packaging.Packaging_Itemnr,  
PD_Packaging.Packaging_Description,  
PD_Packaging.Packaging_Width,   
PD_Packaging.Packaging_Weight,   
PD_Packaging.Packaging_Weightgm2,   
PD_Packaging.Packaging_Overlap,   
PD_Packaging.Packaging_Verstrekking,   
PD_Packaging.Packaging_CategoryName,    
PD_Main.Main_StatusID,  
PD_Main.Main_Itemnr,
system_Machine.Machine_omschrijving,   
PD_Main.Main_Product,   
PD_Main.Main_WidthTobeInvoiced,  
PD_Main.Main_AssemblingRollDiameter,  
PD_Main.Main_AssemblingRollLength,  
PD_Main.Main_LabelArea,    
PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width,  
PD_FleeceRecipe.FleeceRecipe_IntermediateLayer2Width,  
PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth

FROM testsystemOBB.dbo.PD_Packaging PD_Packaging    
LEFT OUTER JOIN testsystemOBB.dbo.PD_Main
ON PD_Packaging.Packaging_ID = PD_Main.Main_AssemblingPackagingSingleRollID AND PD_Main.Main_StatusID = 2

LEFT OUTER JOIN testsystemOBB.dbo.PD_FleeceRecipe  
ON PD_Main.Main_ID = PD_FleeceRecipe.FleeceRecipe_MainID AND FleeceRecipe_Preferred = 1    

LEFT OUTER JOIN testsystemOBB.dbo.BOM_Results  
ON PD_Main.Main_Itemnr = BOM_Results.Item_Number

LEFT OUTER JOIN testsystemOBB.dbo.system_Machine  
ON BOM_Results.SelMachineID = system_Machine.Machine_id

WHERE (PD_Packaging.Packaging_CategoryName='STRETCH')  AND (PD_Main.Main_Itemnr = 406181)

Я также попробовал небольшой пример с другой функцией ISNULL, но в результате получается «Неожиданный RES за списком столбцов выбора». Я не понимаю в чем моя ошибка.

SELECT

IIF (system_Machine.Machine_omschrijving IN ('BE'),
IIF (ISNULL(FleeceRecipe_IntermediateLayer1Width), 3,4))

[res] ,

PD_Packaging.Packaging_Itemnr,  
PD_Packaging.Packaging_Description,  
PD_Packaging.Packaging_Width,   
PD_Packaging.Packaging_Weight,   
PD_Packaging.Packaging_Weightgm2,   
PD_Packaging.Packaging_Overlap,   
PD_Packaging.Packaging_Verstrekking,   
PD_Packaging.Packaging_CategoryName,    
PD_Main.Main_StatusID,  
PD_Main.Main_Itemnr,
system_Machine.Machine_omschrijving,   
PD_Main.Main_Product,   
PD_Main.Main_WidthTobeInvoiced,  
PD_Main.Main_AssemblingRollDiameter,  
PD_Main.Main_AssemblingRollLength,  
PD_Main.Main_LabelArea,    
PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width,  
PD_FleeceRecipe.FleeceRecipe_IntermediateLayer2Width,  
PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth

FROM testsystemOBB.dbo.PD_Packaging PD_Packaging    
LEFT OUTER JOIN testsystemOBB.dbo.PD_Main
ON PD_Packaging.Packaging_ID = PD_Main.Main_AssemblingPackagingSingleRollID AND PD_Main.Main_StatusID = 2

LEFT OUTER JOIN testsystemOBB.dbo.PD_FleeceRecipe  
ON PD_Main.Main_ID = PD_FleeceRecipe.FleeceRecipe_MainID AND FleeceRecipe_Preferred = 1    

LEFT OUTER JOIN testsystemOBB.dbo.BOM_Results  
ON PD_Main.Main_Itemnr = BOM_Results.Item_Number

LEFT OUTER JOIN testsystemOBB.dbo.system_Machine  
ON BOM_Results.SelMachineID = system_Machine.Machine_id

WHERE (PD_Packaging.Packaging_CategoryName='STRETCH')  AND (PD_Main.Main_Itemnr = 406181)

enter image description here

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Попробуйте вместо этого использовать вложенные операторы case.

Одна вещь, которую я заметил, - нет другого варианта, если Machine_omschrijving IN ('BE') не оценивается как true.

С операторами case, ELSE необязательно. Если не возвращается, он просто вернет NULL

SELECT
    case 
        when system_Machine.Machine_omschrijving IN ('BE') 
        Then
            case 
                when PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width is NULL
                Then
                    Case 
                        when PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth is NULL
                        Then PD_FleeceRecipe.FleeceRecipe_IntermediateLayer2Width
                        Else PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth
                    End
                Else
                    Case 
                        when PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth is NULL
                        then
                            case 
                                when PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width is NULL
                                then PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth
                                Else PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width
                            End
                        Else (PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth-PD_FleeceRecipe.FleeceRecipe_IntermediateLayer2Width+PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width-PD_FleeceRecipe.FleeceRecipe_IntermediateLayer2Width)
                    End
            End
    End
    [res] ,


    PD_Packaging.Packaging_Itemnr,  
    PD_Packaging.Packaging_Description,  
    PD_Packaging.Packaging_Width,   
    PD_Packaging.Packaging_Weight,   
    PD_Packaging.Packaging_Weightgm2,   
    PD_Packaging.Packaging_Overlap,   
    PD_Packaging.Packaging_Verstrekking,   
    PD_Packaging.Packaging_CategoryName,    
    PD_Main.Main_StatusID,  
    PD_Main.Main_Itemnr,
    system_Machine.Machine_omschrijving,   
    PD_Main.Main_Product,   
    PD_Main.Main_WidthTobeInvoiced,  
    PD_Main.Main_AssemblingRollDiameter,  
    PD_Main.Main_AssemblingRollLength,  
    PD_Main.Main_LabelArea,    
    PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width,  
    PD_FleeceRecipe.FleeceRecipe_IntermediateLayer2Width,  
    PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth

FROM 
    testsystemOBB.dbo.PD_Packaging PD_Packaging    
    LEFT OUTER JOIN testsystemOBB.dbo.PD_Main ON PD_Packaging.Packaging_ID = PD_Main.Main_AssemblingPackagingSingleRollID AND PD_Main.Main_StatusID = 2
    LEFT OUTER JOIN testsystemOBB.dbo.PD_FleeceRecipe  ON PD_Main.Main_ID = PD_FleeceRecipe.FleeceRecipe_MainID AND FleeceRecipe_Preferred = 1    
    LEFT OUTER JOIN testsystemOBB.dbo.BOM_Results  ON PD_Main.Main_Itemnr = BOM_Results.Item_Number
    LEFT OUTER JOIN testsystemOBB.dbo.system_Machine  ON BOM_Results.SelMachineID = system_Machine.Machine_id

WHERE 
    (PD_Packaging.Packaging_CategoryName='STRETCH')  AND (PD_Main.Main_Itemnr = 406181)
0 голосов
/ 11 марта 2020

У вас есть синтаксические ошибки. Функция IIF состоит из трех обязательных частей:
выражение условия, истинное значение и ложное значение.

Вам не хватает ложного выражения в самой внешней функции iif в обоих запросах, а также запятой после этого (и в первом запросе слишком много закрывающих скобок)

В вашем первом запросе:

SELECT

IIF (
    system_Machine.Machine_omschrijving IN ('BE'),
    IIF(PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width is NULL,
        IIF (PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth is NULL, 
             PD_FleeceRecipe.FleeceRecipe_IntermediateLayer2Width, 
             PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth
        ),
        IIF(PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth is NULL,
            IIF(PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width is NULL, 
                PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth, 
                PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width
            ),
            PD_FleeceRecipe.FleeceRecipe_BottomLayerWidth - PD_FleeceRecipe.FleeceRecipe_IntermediateLayer2Width + PD_FleeceRecipe.FleeceRecipe_IntermediateLayer1Width - PD_FleeceRecipe.FleeceRecipe_IntermediateLayer2Width
        )
    )
/* Missing a false value here...*/) 
-- ) this closing parenthesis shouldn't be here. Instead, there should be a comma.
[res] ,

А что касается второго запроса:

SELECT

IIF (system_Machine.Machine_omschrijving IN ('BE'),
    IIF (ISNULL(FleeceRecipe_IntermediateLayer1Width), 3,4)
    -- missing a false value here
) -- missing a comma here

[res] ,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...