2015-09-02 3 views
1

Я унаследовал запрос Access со следующим оператором IIF, который я пытаюсь преобразовать в условие SQL Where. Я играл с этим в течение нескольких дней, не могу заставить его возвращать те же результаты. Любая помощь будет оценена по достоинству.Access IIF выражение преобразовать в SQL

Доступ

WHERE (((IIf([EFFDATE]-[MATDATE]<>[PDU_DAYS]-1 And [Calc_Type]="Cycles",IIf([PDU_DAYS] Between [30DayDQMin]+1 And [89DayDQMax]+1,"Yes","No"),IIf([PDU_DAYS] Between 31 And 90,"Yes","No")))="Yes")); 

Для кода SQL я играл с различными логическими выражениями, такие как следующие. Я также попытался построить некоторую логику случая. Пока не повезло.

([EffDATE]-[MatDate] <> [PDU_Days]-1 and CalcType = 'Cycles' and PDU_Days Between [30DayDQMin]+1 and [89DayDQMax]+1 or PDU_Days Between 31 and 90) 
+0

Каковы типы данных ose поля? –

ответ

0

Вы должны добиться успеха, используя несколько случая, когда х THEN ELSE а инструкции б END следующим образом:

WHERE 
CASE WHEN (([EFFDATE]-[MATDATE]<>[PDU_DAYS]-1) And ([Calc_Type]='Cycles')) THEN 
    CASE WHEN (([PDU_DAYS] Between [30DayDQMin]+1) And ([89DayDQMax]+1)) 
     THEN 'Yes' ELSE 'No' END 
ELSE 
    CASE WHEN ([PDU_DAYS] Between 31 And 90) THEN 'Yes' ELSE 'No' END 
END 

= 'Yes' 

вида T-SQL одинарной кавычки стиля!

0

Здесь равносильна Синтаксис SQL-сервер:

(
    CASE WHEN ([EFFDATE]-[MATDATE] <> [PDU_DAYS]-1 AND [Calc_Type]= 'Cycles') THEN 
     CASE WHEN ([PDU_DAYS] BETWEEN [30DayDQMin]+1 AND [89DayDQMax]+1) THEN 'Yes' ELSE 'No' END 
    ELSE 
     CASE WHEN [PDU_DAYS] BETWEEN 31 AND 90 THEN 'Yes' ELSE 'No' END 
    END 
) = 'yes' 

и если [MATDATE] и [EFFDATE] являются datetime поля затем:

(
    CASE WHEN (DATEDIFF(dd,[MATDATE],[EFFDATE]) <> [PDU_DAYS]-1 AND [Calc_Type]= 'Cycles') THEN 
     CASE WHEN ([PDU_DAYS] BETWEEN [30DayDQMin]+1 AND [89DayDQMax]+1) THEN 'Yes' ELSE 'No' END 
    ELSE 
     CASE WHEN [PDU_DAYS] BETWEEN 31 AND 90 THEN 'Yes' ELSE 'No' END 
    END 
) = 'Yes' 
+0

Это сработало, я очень ценю это. – GB7

0

Вы действительно не должны все это условное convolutedness, это должно дать тот же результат:

WHERE ([EFFDATE]-[MATDATE]<>[PDU_DAYS]-1 
     AND [Calc_Type]="Cycles" 
     AND ([PDU_DAYS] BETWEEN [30DayDQMin]+1 AND [89DayDQMax]+1) 
    ) 
     OR ([PDU_DAYS] Between 31 And 90) 
Смежные вопросы