Как правильно сделать в запросе проверку на NULL ? #627857


#0 by Ткачев
Сабж
#1 by golden-pack
А разве есть варианты ?
#2 by shuhard
оба варианта в топку
#3 by Ткачев
Тогда как ?
#4 by Ткачев
Весь запрос:
#5 by andrewks
сумма зачем?
#6 by Ткачев
Надо получить сумму с начала смены и по конец смены.
#7 by MatrosoV AleXXXand_R
так если что правильнее при любых раскладах
#8 by Гобсек
Вместо обычно пишут просто РасходнаяНакладная.Проведен
#9 by Рэйв
Иначе при нулл вылетит по ошибке
#10 by MatrosoV AleXXXand_R
вот это что? Почему не соединением с таблицами?
#11 by Гобсек
.
#12 by andrewks
запрос в нерабочий
#13 by bodri
так.
#14 by Ткачев
А соединение не надо, надо даты начала смены и конца.
#15 by ДенисЧ
#16 by andrewks
у меня встречный вопрос: а откуда вообще берётся null?
#17 by mehfk
Посмотрел в коде УПП оба варианта используются. ISNULL(SUM(Выражение),0) должен быть быстрее
#18 by MatrosoV AleXXXand_R
в его случае не в каком
#19 by andrewks
вот о том и речь. а ответ на сабжевый вопрос зависит от конкретной задачи
#20 by Ткачев
С чего ради, этой номенклатуры может и не быть в смене.
#21 by andrewks
какой - этой?
#22 by Ткачев
|    И РасходнаяНакладнаяУслуги.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПополнениеБалансаВодителей)
#23 by Рэйв
При левом соединении Номенклатуры с чем то где суммы, если в таблице сумм нет номенклатуры - будет NULL
#24 by andrewks
и? продолжай
#25 by MatrosoV AleXXXand_R
проверка на ЕстьNULL в твоем случае не нужна Она нужна к примеру вот в таком запросе ВЫБРАТЬ если что - запрос набрал руками. Вообщем, думаю что из него понятно, что из Таблица2 можем получить сумму NULL и преобразовываем ее в 0, а из Таблица1 в данном случае мы получаем всегда число - и ЕСТЬNULL просто не нужна
#26 by andrewks
где здесь левое соединение?
#27 by andrewks
одно из двух - либо вы загнались, либо я
#28 by Рэйв
Здесь - это где?
#29 by Рэйв
Я описал возможный вариант полученя нулла в сумме
#30 by Ткачев
Но вылазит ошибка, СУММА(РасходнаяНакладнаяУслуги.Сумма) КАК Сумма = NULL
#31 by acsent
если запрос вернет 0 записей то оба варианта ддут NULL
#32 by andrewks
мы здесь вроде как конкретный запрос обсуждаем
#33 by Рэйв
Тогда вообзе будет пустой результат без всяких нулов
#34 by Ткачев
+Если что раньше ЕСТЬNULL тут не стоял.
#35 by andrewks
во!
#36 by acsent
нет ибо агрегат
#37 by Рэйв
аа...Пропустил :-)
#38 by Ненавижу 1С
никакой разницы, но я за ЕСТЬNULL(СУММА(...),0)
#39 by andrewks
"никакой разницы"  разница есть
#41 by Ткачев
Раньше не было, я его сейчас поставил и задумался где же его лучше поставить до СУММА или после.
#43 by Ткачев
Я тоже, здесь либо есть NULL, либо его нету.
#44 by Ненавижу 1С
только если выборка пустая, то есть
#45 by Анцеранана
Имхо предпочтительнее первый вариант если без группировок ниже, а если ниже написано ГРУППИРОВАТЬ то второй. не голосую!
#46 by Ткачев
Господа вариант1 работает, а вариант2 дает. {Форма.Форма.Форма}: Преобразование значения к типу Число не может быть выполнено
#47 by andrewks
не только. возьмём, например, выборку из таблицы, где во всех строках Null
#48 by andrewks
ы-ы-ы :-)  попытка на DB2 просуммировать табличку из одних нуллов как isnull(sum,0) завершилась успешно, результата - 0, а вот с sum(isnull(,0))  -вывалило 1С с ошибкой SDBL
#49 by Светлый Гений
Конечно 2
#50 by Ткачев
Если Сумма = NULL, тогда НачДата и КонДата тоже = NULL, можно как то сделать что бы они были правильно полученными из временных таблиц ?
#51 by spock
всех голосовавших за вариант 1 срочно на переаттестацию
#52 by Ткачев
->
#53 by spock
так изучать запросы тебе нужно, твой запрос из неявно преобразован в full join с соответсвующими выводами.
#54 by spock
+53 запрос в вообще работает так, как ты задумывал?
#55 by SherifSP
Правильнее
#56 by mehfk
Типовые смотрел?
#57 by Ненавижу 1С
уговорил))
#58 by andrewks
какой ещё фулл джойн? кросс джойн, наверное?
#59 by andrewks
+ попробуй соединить через запятую пустую таблицу
#60 by andrewks
я так понимаю, "," = "inner join on true"
#61 by fisher
Сумма вернет NULL, только если во всех строках было NULL, т.к. по дефолту NULL при агрегации игнорируется. Т.е. по результату оба варианты равнозначны. Но вообще, если не ошибаюсь, в сиквеле это поведение можно менять. Так что теоретически второй вариант однозначнее. На практике же - монопенисуально.
#62 by Schwonder
Таки не монопенисуально, в Вашем случае, каждое сумма будет проверяться на NULL, а в случае "ЕСТЬNULL(СУММА(РасходнаяНакладнаяУслуги.Сумма), 0)" только результат. Какбэ производительность!!!
#63 by Ткачев
Кто за 2 объясните тогда почему вываливается в ошибку см., Результат.Сумма там равно NULL
#64 by Sammo
Емнип, была фишка - в случае, когда 1. В результате запроса только значения агрегатов (функций) 2. На входе были NULL В этом случае Выборка.Количество = 1 и в там строки с нулами Решение - обрабатывать такую ситуацию или добавить поле. Например, добавить в результат выборки РасходнаяНакладнаяУслуги.Номенклатура
#65 by rs_trade
очевидно же что первый вариант будет 0 давать если будет хоть один нулл
#66 by Reset
Второй вараинт даст null при пустой выборке
#67 by Schwonder
Это в чем же Ваша очевидность заключается?
#68 by ssh2006
+1
#69 by spock
да-да, cross, это я пургу прогнал сперепугу
#70 by Reset
Очевидно, (с) :) что проверка на null производится в обоих случаях. В одном из случаев просто можно указать, как его интерпретировать, во втром это по умолчанию
#71 by andrewks
нифига
#72 by rs_trade
вру. sum null-ы игнорит
#73 by Schwonder
Золотые слова Юрий Венедиктович (ц)
#74 by spock
у какие-то временные таблицы пустые.
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

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