Имя: Пароль:
1C
1С v8
Многоуровневая конструкция КОГДА ТОГДА в запросе
,
0 fantomrik
 
07.08.13
00:13
Доброй ночи! То ли не понимаю, то ли пишу не так синтаксис... Есть 3 адреса у физ лица, (проживания,прописка, информирование)  Мне нужно выбрать первый который заполнен из трех в этом же порядке. Отдельными ВТ получаю все 3 значения далее пытаюсь так

ВЫБОР
    КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL
        ТОГДА ФИОиАдрес2.Адрес
    КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL
        ТОГДА ФИОиАдрес3.Адрес
    ИНАЧЕ ФИОиАдрес1.Адрес
КОНЕЦ

если заполены 1ый и 2ой то все ок, а если они пусты но заполнен 3ий - все равно null получаю. Что не так делаю?
1 Нуф-Нуф
 
07.08.13
00:14
значит все 3 нул
2 Нуф-Нуф
 
07.08.13
00:16
внезапно?
3 Пират
 
07.08.13
00:19
ВЫБОР
    КОГДА         ТОГДА
    КОГДА         ТОГДА
    ИНАЧЕ
КОНЕЦ

Конструкция проходит два условия, а не одно
4 Jaap Vduul
 
07.08.13
00:20
ВЫБОР
    КОГДА НЕ ФИОиАдрес1.Адрес ЕСТЬ NULL
        ТОГДА ФИОиАдрес1.Адрес
    КОГДА НЕ ФИОиАдрес2.Адрес ЕСТЬ NULL
        ТОГДА ФИОиАдрес2.Адрес
    ИНАЧЕ ФИОиАдрес3.Адрес
КОНЕЦ

или

ЕСТЬNULL(ФИОиАдрес1.Адрес, ЕСТЬNULL(ФИОиАдрес2.Адрес, ФИОиАдрес3.Адрес))
5 Нуф-Нуф
 
07.08.13
00:20
ВЫБОР
    КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL
        ТОГДА ФИОиАдрес2.Адрес
    КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL
        ТОГДА ФИОиАдрес3.Адрес
    КОГДА ФИОиАдрес3.Адрес ЕСТЬ NULL
        ТОГДА "Внезапно"
    ИНАЧЕ ФИОиАдрес3.Адрес
КОНЕЦ
6 Пират
 
07.08.13
00:22
ВЫБОР
    КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL
        ТОГДА ФИОиАдрес2.Адрес
ИНАЧЕ ВЫБОР
    КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL
        ТОГДА ФИОиАдрес3.Адрес
    ИНАЧЕ ФИОиАдрес1.Адрес
КОНЕЦ
КОНЕЦ
7 Пират
 
07.08.13
00:23
короче, как то так
8 Jaap Vduul
 
07.08.13
00:24
(6)Такая же ошибка, как и у ТС.
9 Пират
 
07.08.13
00:25
вообще, вот эта фигня типа
КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL
КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL
КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL
КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL
КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL
КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL

работает не оптимально как с точки зрения запроса - проверяются все условия, прежде чем принимается решение.

Пиши вложенные фигни ВЫбор Когда Тогда Иначе Конец
10 Пират
 
07.08.13
00:26
(8) пофигу
11 Jaap Vduul
 
07.08.13
00:33
(9)
>>проверяются все условия, прежде чем принимается решение

По-крайней мере, при использовании в качестве СУБД sql server это не так. Вычисление выполняется последовательно, но прекращается после первого же истинного условия.
12 Пират
 
07.08.13
00:39
(11) ничего оно не прекращается

В такой конструкции будет

ВЫБОР
    (ПЕРВАЯ ПРОВЕРКА)КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL        ТОГДА ФИОиАдрес2.Адрес
    (ВТОРАЯ ПРОВЕРКА)КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL
        ТОГДА ФИОиАдрес3.Адрес
    ИНАЧЕ ФИОиАдрес1.Адрес
КОНЕЦ
13 Пират
 
07.08.13
00:43
Чтобы не было проверок всех условий на истинность, надо писать так

Выбор
Когда Выбор Когда Тогда Иначе Конец Тогда Иначе Конец
14 Miss1C
 
07.08.13
00:44
(0) Спать уже пора)
15 Jaap Vduul
 
07.08.13
00:46
(13)
"Вы, Шариков, чепуху говорите и возмутительнее всего то, что говорите ее безапелляционно и уверенно."
16 Пират
 
07.08.13
00:49
(15) Дядя, ну логически подумай.

ВЫБОР
    (ПЕРВАЯ ПРОВЕРКА)КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL        ТОГДА ФИОиАдрес2.Адрес
    (ВТОРАЯ ПРОВЕРКА)КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL
        ТОГДА ФИОиАдрес3.Адрес
    ИНАЧЕ ФИОиАдрес1.Адрес
КОНЕЦ

Если ПЕРВАЯ ПРОВЕРКА будет ИСТИНА, один фиг выполнится ВТОРАЯ ПРОВЕРКА и если она тоже будет ИСТИНА, то присвоится значение ФИОиАдрес3.Адрес, а не ФИОиАдрес2.Адрес как ты по своей доброте душевной ожидаешь
17 Пират
 
07.08.13
00:51
Ты у себя на скуле напиши вот так

Выбор
Когда 1=1 Тогда 1
Когда 2=2 Тогда 2
Когда 3=3 Тогда 3
Иначе 4
Конец

И посмотри, что тебе скуль вернет.
18 fantomrik
 
07.08.13
01:04
(5) (6) не работает, NULL возвращает( (17) С sql  напрямую не работал ни когда
19 fantomrik
 
07.08.13
01:07
20 Пират
 
07.08.13
01:09
ВЫБОР
    КОГДА ФИОиАдрес1.Адрес ЕСТЬ NULL
        ТОГДА
Выбор
КОГДА ФИОиАдрес2.Адрес ЕСТЬ NULL Тогда  ФИОиАдрес3.Адрес Иначе ФИОиАдрес2.Адрес  Конец
    ИНАЧЕ "НЕТУ НИМУЯ АДРЕСОВ"
КОНЕЦ

так должно сработать, инфа 100%
21 Пират
 
07.08.13
01:12
(18) а чего у тебя на (17) возвращает?
22 fantomrik
 
07.08.13
01:13
(20) Спасибо, так работает. Это оптимальный способ выбора в этой ситуации? просто для себя интересно, нужно учится правильно писать стараться
23 Пират
 
07.08.13
01:13
(22) да, почему оптимальный, писал выше. Пожалуйста.
24 fantomrik
 
07.08.13
01:15
(23) Еще раз благодарю!!!
Всем спасибо за участие!!!
25 Jaap Vduul
 
07.08.13
01:16
Как раз вложенный ВЫБОР не является оптимальным, его нужно избегать по возможности.
26 fantomrik
 
07.08.13
01:18
(25) А как проверить кто из Вас прав? :)
27 Пират
 
07.08.13
01:18
(25) иди учи уроки
28 fantomrik
 
07.08.13
01:24
(27)вспомнилось.. у нас сотрудник работал, он рассказывал, пока работал в др конторе у них было так в отделе: спор зашел, забились, проверили (не понял только как в виду своей неопытности) замером производительности и проигравший сразу идет к автомату за шоколадкой победителю :)
29 Jaap Vduul
 
07.08.13
01:34
(28)
В данном случае выражение не очень сложное, поэтому разница между линейным и вложенным case будет практически незаметна.
То что на sql server вычисляется только до первого истинного условия можно в первоисточнике почитать:
http://technet.microsoft.com/ru-ru/library/ms181765.aspx
Линейный кейс и читается проще и выполняется быстрее.
30 Jaap Vduul
 
07.08.13
01:40
+29
Кстати, если, например, в выражении ВЫБОР используются бухгалтерские субконто (т.е. составные типы), то уже даже на первом уровне вложенности очень легко поймать ошибку оптимизатора "an expression services limit has been reached".
31 Волчара2010
 
07.08.13
09:24
(29) да чувак, ты прав. Так и работает. Никому на слово верить нельзя: сдавал тест и бородатый руководитель убедил меня, что проверяются все условия, если нет уровней вложенности. Все врут и надо верить только своим глазам и литературе.
32 Волчара2010
 
07.08.13
09:24
я перат, если чо
33 Starhan
 
07.08.13
09:27
(0) очевидно же 2 первых услвоия не выполняются поэтому берется адрес1, где как раз нулл.
34 Jaap Vduul
 
07.08.13
09:57
(33)Ещё один...
Выполняется как раз первое условие.