|
Многоуровневая конструкция КОГДА ТОГДА в запросе | ☑ | ||
---|---|---|---|---|
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)Ещё один...
Выполняется как раз первое условие. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |