Многоуровневая конструкция КОГДА ТОГДА в запросе #675947


#0 by fantomrik
Доброй ночи! То ли не понимаю, то ли пишу не так синтаксис... Есть 3 адреса у физ лица, (проживания,прописка, информирование)  Мне нужно выбрать первый который заполнен из трех в этом же порядке. Отдельными ВТ получаю все 3 значения далее пытаюсь так ВЫБОР     КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL         ТОГДА ФИОиАдрес2.Адрес     КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL если заполены 1ый и 2ой то все ок, а если они пусты но заполнен 3ий - все равно null получаю. Что не так делаю?
#1 by Нуф-Нуф
значит все 3 нул
#2 by Нуф-Нуф
внезапно?
#3 by Пират
Конструкция проходит два условия, а не одно
#4 by Jaap Vduul
ВЫБОР     КОГДА НЕ ФИОиАдрес1.Адрес ЕСТЬ NULL         ТОГДА ФИОиАдрес1.Адрес     КОГДА НЕ ФИОиАдрес2.Адрес ЕСТЬ NULL или
#5 by Нуф-Нуф
ВЫБОР     КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL         ТОГДА ФИОиАдрес2.Адрес     КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL         ТОГДА ФИОиАдрес3.Адрес     КОГДА ФИОиАдрес3.Адрес ЕСТЬ NULL
#6 by Пират
ВЫБОР     КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL ИНАЧЕ ВЫБОР     КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL КОНЕЦ
#7 by Пират
короче, как то так
#8 by Jaap Vduul
Такая же ошибка, как и у ТС.
#9 by Пират
вообще, вот эта фигня типа КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL работает не оптимально как с точки зрения запроса - проверяются все условия, прежде чем принимается решение. Пиши вложенные фигни ВЫбор Когда Тогда Иначе Конец
#10 by Пират
пофигу
#11 by Jaap Vduul
>>проверяются все условия, прежде чем принимается решение По-крайней мере, при использовании в качестве СУБД sql server это не так. Вычисление выполняется последовательно, но прекращается после первого же истинного условия.
#12 by Пират
ничего оно не прекращается В такой конструкции будет ВЫБОР     (ПЕРВАЯ ПРОВЕРКА)КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL        ТОГДА ФИОиАдрес2.Адрес     (ВТОРАЯ ПРОВЕРКА)КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL КОНЕЦ
#13 by Пират
Чтобы не было проверок всех условий на истинность, надо писать так Выбор Когда Выбор Когда Тогда Иначе Конец Тогда Иначе Конец
#14 by Miss1C
Спать уже пора)
#15 by Jaap Vduul
"Вы, Шариков, чепуху говорите и возмутительнее всего то, что говорите ее безапелляционно и уверенно."
#16 by Пират
Дядя, ну логически подумай. ВЫБОР     (ПЕРВАЯ ПРОВЕРКА)КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL        ТОГДА ФИОиАдрес2.Адрес     (ВТОРАЯ ПРОВЕРКА)КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL Если ПЕРВАЯ ПРОВЕРКА будет ИСТИНА, один фиг выполнится ВТОРАЯ ПРОВЕРКА и если она тоже будет ИСТИНА, то присвоится значение ФИОиАдрес3.Адрес, а не ФИОиАдрес2.Адрес как ты по своей доброте душевной ожидаешь
#17 by Пират
Ты у себя на скуле напиши вот так Выбор Когда 1=1 Тогда 1 Когда 2=2 Тогда 2 Когда 3=3 Тогда 3 Иначе 4 Конец И посмотри, что тебе скуль вернет.
#18 by fantomrik
не работает, NULL возвращает( С sql  напрямую не работал ни когда
#19 by fantomrik
#20 by Пират
ВЫБОР     КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL         ТОГДА Выбор КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL Тогда  ФИОиАдрес3.Адрес Иначе ФИОиАдрес2.Адрес  Конец     ИНАЧЕ "НЕТУ НИМУЯ АДРЕСОВ" КОНЕЦ так должно сработать, инфа 100%
#21 by Пират
а чего у тебя на возвращает?
#22 by fantomrik
Спасибо, так работает. Это оптимальный способ выбора в этой ситуации? просто для себя интересно, нужно учится правильно писать стараться
#23 by Пират
да, почему оптимальный, писал выше. Пожалуйста.
#24 by fantomrik
Еще раз благодарю!!! Всем спасибо за участие!!!
#25 by Jaap Vduul
Как раз вложенный ВЫБОР не является оптимальным, его нужно избегать по возможности.
#26 by fantomrik
А как проверить кто из Вас прав? :)
#27 by Пират
иди учи уроки
#28 by fantomrik
вспомнилось.. у нас сотрудник работал, он рассказывал, пока работал в др конторе у них было так в отделе: спор зашел, забились, проверили (не понял только как в виду своей неопытности) замером производительности и проигравший сразу идет к автомату за шоколадкой победителю :)
#29 by Jaap Vduul
В данном случае выражение не очень сложное, поэтому разница между линейным и вложенным case будет практически незаметна. То что на sql server вычисляется только до первого истинного условия можно в первоисточнике почитать: Линейный кейс и читается проще и выполняется быстрее.
#30 by Jaap Vduul
+29 Кстати, если, например, в выражении ВЫБОР используются бухгалтерские субконто (т.е. составные типы), то уже даже на первом уровне вложенности очень легко поймать ошибку оптимизатора "an expression services limit has been reached".
#31 by Волчара2010
да чувак, ты прав. Так и работает. Никому на слово верить нельзя: сдавал тест и бородатый руководитель убедил меня, что проверяются все условия, если нет уровней вложенности. Все врут и надо верить только своим глазам и литературе.
#32 by Волчара2010
я перат, если чо
#33 by Starhan
очевидно же 2 первых услвоия не выполняются поэтому берется адрес1, где как раз нулл.
#34 by Jaap Vduul
Ещё один... Выполняется как раз первое условие.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С