Условие iff Доступ к синтаксису SQL

У меня есть запрос доступа, который я воссоздал в SQL.

Доступ:

   SELECT Columns , 

IIf([Col1]="X",IIf([COL2]<>"XXXX",1,0)) AS NEWCOL1, 

IIf([COL2] Not In ("HHH","GGG"),1,0) AS [NEWCOL2], 

IIf(([NEWCOL1]=1) Or ([NEWCOL2]=1),1,0) AS NEWCOL3 

FROM [TABLE]

WHERE ((([TABLE].COL2)<>"XXXX")) OR ((([TABLE].COL2)<>"HHH" And ([TABLE].COL2)<>"GGG"));

В SQL:

SELECT Columns , 

"NEWCOL1" =
CASE WHEN ([COL1]='X' AND COL2<> 'XXXX') THEN 1 
ELSE 0
END,

"NEWCOL2" =

CASE WHEN COL2 NOT IN ('HHH','GGG') THEN 1
ELSE 0
END ,

IIf(([NEWCOL1]=1) Or ([NEWCOL2]=1),1,0) AS NEWCOL3 


FROM [TABLE]

WHERE ((([TABLE].COL2)<>'XXXX')) OR ((([TABLE].COL2)<>'HHH' And ([TABLE].COL2)<>'GGG'));

IIf(([NEWCOL1]=1) или ([NEWCOL2]=1),1,0) КАК NEWCOL3

Когда я использую Newcol1 и newcol2, он выдает ошибку недопустимого столбца, как их можно использовать, возможно, во вложенном случае или в выражении iif


person WiredTheories    schedule 12.11.2014    source источник
comment
используйте оператор case, это будет намного проще.   -  person xQbert    schedule 12.11.2014
comment
Какую версию SQL Server вы используете? iifподдерживается в 2012 и более поздних версиях.   -  person jpw    schedule 12.11.2014
comment
Я знаю о Кейсе. Это 2012 год   -  person WiredTheories    schedule 12.11.2014
comment
Не совсем дубликат, но ваш ответ здесь: stackoverflow. com/questions/22839254/sql-server-iif-vs-case   -  person Tab Alleman    schedule 12.11.2014
comment
IIf(([NEWCOL1]=1) Или ([NEWCOL2]=1),1,0) AS NEWCOL3 WHERE NEWCOL1 AND NEWCOL2 выдает ошибку как недопустимый столбец. Как я мог использовать его в условии IIf   -  person WiredTheories    schedule 12.11.2014
comment
Недопустимый столбец — это тот, который формируется из первого оператора case и повторно используется в последнем операторе case. Я думаю, теперь должно быть ясно, чего я пытаюсь достичь   -  person WiredTheories    schedule 12.11.2014
comment
Два варианта: 1. Если вам не нужны NewCol1 или NewCol2 в окончательном выводе, вы можете вложить два оператора CASE и получить только NewCol3. Или, если вам нужны все три столбца, вы можете сгенерировать NewCol1 и 2 в подзапросе или cte и получить NewCol3 во внешнем запросе.   -  person Tab Alleman    schedule 12.11.2014
comment
Мне нужны NewCOl1 , NewCol2 в моем последнем o/p. У меня очень мало знаний о CTE. Можете ли вы сообщить мне, какой другой вариант я могу использовать?   -  person WiredTheories    schedule 12.11.2014
comment
@TabAlleman Спасибо, что указали мне направление подвыборки. Я достиг своей цели с ним :). В приведенной ниже строке кода. IIf([Col1]=X,IIf([COL2]‹›XXXX,1,0)) AS NEWCOL1 Должно быть NEWCOL1 = CASE WHEN ([COL1]='X' AND COL2‹› 'XXXX') THEN 1 ELSE 0 END, NEWCOL1 = CASE WHEN ([COL1]='X' OR COL2‹› 'XXXX') THEN 1 ELSE 0 END,   -  person WiredTheories    schedule 12.11.2014
comment
Я добавил к моему ответу подход cte.   -  person Tab Alleman    schedule 12.11.2014


Ответы (1)


Если вы находитесь в SQL 2012, где IIF() действителен, похоже, проблема в том, что у вас нет значения ELSE для первого внешнего случая:

IIf([Col1]='X',IIf([COL2]<>'XXXX',1,0){,NEED SOME ELSE VALUE HERE}) AS NEWCOL1, 

Я не знаю, почему это будет работать в Access. Я предполагаю, что Access должен быть более «фиктивным», чем SQL Server.

Чтобы заменить исходный первый IIF на CASE, вы должны сделать следующее:

CASE WHEN [Col1]='X' THEN 
  CASE WHEN [COL2]<>'XXXX' THEN 1 ELSE 0 END
END

Не предоставляя ELSE для первого условия, если [Col1] не равно 'X', оператор вернет NULL без возникновения ошибки.

Чтобы обработать ваш последний запрос с помощью CTE, вы можете сделать следующее:

WITH cte AS (
  SELECT 
    Columns,
    CASE WHEN ([COL1]='X' AND COL2<> 'XXXX') THEN 1 ELSE 0 END AS NEWCOL1,
    CASE WHEN COL2 NOT IN ('HHH','GGG') THEN 1 ELSE 0 END AS NEWCOL2
  FROM [TABLE]
  WHERE ((([TABLE].COL2)<>'XXXX')) OR ((([TABLE].COL2)<>'HHH' And ([TABLE].COL2)<>'GGG'))
)
SELECT *, IIf(([NEWCOL1]=1) Or ([NEWCOL2]=1),1,0) AS NEWCOL3 
FROM cte;
person Tab Alleman    schedule 12.11.2014
comment
Я создал iif как Case , оператор case создает 2 столбца, столбцы которых необходимо проверить снова. Ньюкол1 и Ньюкол2. Итак, как использовать столбцы в следующем случае, поскольку это столбцы, созданные в коде. - person WiredTheories; 12.11.2014
comment
CASE WHEN [Col1]='X' THEN CASE WHEN [COL2]‹›'XXXX' THEN 1 ELSE 0 END END , Этот оператор выводит нулевые значения для этого конкретного столбца. - person WiredTheories; 12.11.2014
comment
Да, это то, что я сказал в моем последнем абзаце. Чтобы избежать NULL, укажите ELSE для внешнего оператора CASE. - person Tab Alleman; 12.11.2014
comment
Да, я поместил else во внешний регистр. Но не могу ли я И условие или ИЛИ получить тот же результат - person WiredTheories; 12.11.2014
comment
Возможно, в зависимости от того, каким должно быть значение ELSE. - person Tab Alleman; 12.11.2014
comment
Спасибо за просветление меня на CTE. Я думаю, что я буду использовать его больше. Это замечательный подход и альтернатива подвыборке. У меня есть много контрольных запросов, которые нужно воссоздать в SQL. - person WiredTheories; 12.11.2014