hareshdgr8 Ответов: 2

Sql server где с if и else


Я хочу выполнить вот так но получаю ошибку

Мой вопрос звучит так

выберите * от TableNm где ииф(cal1 = хххххххх='правда',(CalStatu1= "готово" и CalDis='в ожидании'),(CalFinal='правда')) 


ПОЛУЧИЛ ОШИБКУ ТИПА
Incorrect syntax near '='.


я хочу, например, если CAL1 истинен, то где условие будет проверяться
CalStatu1='Done' and CalDis='Pending'
в противном случае если проверят мимо
CalFinal='True'


Пожалуйста ответьте

Что я уже пробовал:

select * from TableNm where   iif(CAl1='True',(CalStatu1='Done' and CalDis='Pending'),(CalFinal='True')) 

2 Ответов

Рейтинг:
4

Kevheathfield

Привет,

Я думаю, что вы, возможно, неправильно истолковываете команду Iif.
В документации говорится::

boolean_expression
A valid Boolean expression.

If this argument is not a Boolean expression, then a syntax error is raised.

true_value
Value to return if boolean_expression evaluates to true.

false_value
Value to return if boolean_expression evaluates to false.


Следовательно, ваш синтаксис
select * from TableNm where   iif(CAl1='True',(CalStatu1='Done' and CalDis='Pending'),(CalFinal='True'))
неверно в том смысле, что значение true_value на самом деле является возвращаемым значением.

Очень легко изменить это на оператор case, чтобы сделать ваш проект/запрос переносимым со всеми экземплярами SQL server.

К сожалению, в настоящее время у меня нет MSSQL, но, возможно, нижеприведенное поможет;
select * from TableNm where
case cal1 = 'true' 
	then CalStatu1='Done' and CalDis='Pending'
else
	CalFinal='True'
end 




Надеюсь, это поможет.


hareshdgr8

нет, сэр, та же ошибка получения над CalStatu1='сделано' и CalDis='ожидание'

Скрыть   скопировать код

Incorrect syntax near '='.

Kevheathfield

Мои извинения, я понял, что есть синтаксис, который я пропустил. (Немного трудно без IDE)

Пожалуйста, попробуйте;

select * from TableNm
where CASE WHEN cal1 = 'true' THEN 
CalStatu1 = 'Done' and cal1 = 'true' else CalFinal = 'True' END

hareshdgr8

нет сэр та же ошибка

Неверный синтаксис рядом с '='.

Kevheathfield

Хм, я могу запустить это на экземпляре MySql..
Вот моя последняя попытка канавы, пожалуйста, имейте в виду, что это не оптимально, но, основываясь на названиях столбцов в вопросе, я предполагаю, что это для домашнего проекта.

select * from tablenm
WHERE(cal1 = 'true' AND CalStatu1 = 'Done' and cal1 = 'true')
OR  (cal1 != 'true' AND CalFinal = 'True'));

CHill60

WHERE(cal1 = 'true' AND CalStatu1 = 'Done' and cal1 = 'true')
должно быть
WHERE (CAl1='True' AND CalStatu1='Done' AND CalDis='Pending')
Вы тестируете cal1 = хххххххх дважды

hareshdgr8

Это работа для меня, но не уверен, насколько правильно, но спасибо за вашу помощь ...

Рейтинг:
18

CHill60

Вам не нужен IIF и вам не нужен CASE, вам просто нужно правильно отсортировать ваши AND и OR, например

select * from TableNm where

(CAl1='True' AND CalStatu1='Done' AND CalDis='Pending')
OR
(Cal1 <> 'True' AND CalFinal='True')
Обратите внимание на использование скобок для группировки критериев и. Смешивание и и или вместе без скобок-очень распространенная ошибка. Всегда используйте скобки, чтобы прояснить свое намерение.

С другой стороны, если вы пытаетесь обновить столбцы, то вам нужно делать их по одному за раз и в инструкции Update, например
UPDATE TableNm
SET CalStatu1 = CASE WHEN Cal1 = 'True' THEN 'Done' ELSE CalStatu1 END,
	CalFinal = CASE WHEN CAl1 = 'True' THEN CalFinal ELSE 'True' END


hareshdgr8

Спасибо за вашу помощь ...
Сэр... :-)

CHill60

С удовольствием