ВЫБОР КОГДА в Запросе
В запросе идет выбор
ВЫБОР
КОГДА А=1 Тогда Документ.Реквизит1
КОГДА А=2 Тогда Документ2.Реквизит
КОНЕЦ
Смысл такой, если срабатывает одно условие то берем реквизит из одного документа, если другое то из другого.
Срабатывает первое условие, но почему-то идет во второе и не находит реквизит, так как его нет в этом документе. Почему второе начинает отрабатывать когда уже первое отработало?
Где я туплю?
ВЫБОР
КОГДА А=1 Тогда Документ.Реквизит1
КОГДА А=2 Тогда Документ2.Реквизит
КОНЕЦ
Смысл такой, если срабатывает одно условие то берем реквизит из одного документа, если другое то из другого.
Срабатывает первое условие, но почему-то идет во второе и не находит реквизит, так как его нет в этом документе. Почему второе начинает отрабатывать когда уже первое отработало?
Где я туплю?
По теме из базы знаний
- Аналог PIVOT в запросе 1С (как выполнить транспонирование таблицы в запросе 1С)
- Запрос всей номенклатуры с характеристиками
- Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности
- Заметки по SQL 4: Преобразование в запросе строки в дату одним выражением
- Экспертный взгляд на оптимизацию производительности на примере исправления и декомпозиции запроса
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(1) логика запроса отличается от логики программного кода 1С.
Текст запроса вначале прогоняется через оптимизатор, который и строит план выполнения запроса. И данная ошибка выбрасывается оптимизатором на этапе анализа.
Данная задача решается через подзапросы с "Объединить все".
Текст запроса вначале прогоняется через оптимизатор, который и строит план выполнения запроса. И данная ошибка выбрасывается оптимизатором на этапе анализа.
Данная задача решается через подзапросы с "Объединить все".
(1)ДД, может я что-то не понял, формат оператора такой:
Этого достаточно, если А имеет два значения, иначе:
ВЫБОР
КОГДА <Выражение> ТОГДА <Выражение>
ИНАЧЕ <Выражение>
КОНЕЦ
Этого достаточно, если А имеет два значения, иначе:
ВЫБОР
КОГДА <Выражение> ТОГДА <Выражение>
ИНАЧЕ
ВЫБОР
КОГДА <Выражение> ТОГДА <Выражение>
КОНЕЦ
КОНЕЦ
(9) Так и должно быть. В такой конструкции проверяются все условия в последовательности КОГДА. Результатом будет последнее выполненное условие. Для выхода после проверки условия следует применять ИНАЧЕ и дальше вложенные ВЫБОР КОГДА... Если не уверены, что документ2 или его реквизит существует, делайте проверку на Nuul.
(16)
это не так работает. Последовательность КОГДА работает как ИначеЕсли
Можете сами проверить:
Результат: 1
Так и должно быть. В такой конструкции проверяются все условия в последовательности КОГДА. Результатом будет последнее выполненное условие.
это не так работает. Последовательность КОГДА работает как ИначеЕсли
Можете сами проверить:
ВЫБРАТЬ
ВЫБОР
КОГДА 1 = 1
И 2 = 2
ТОГДА 1
КОГДА 2 = 1
ТОГДА 2
КОГДА 1 = 1
ТОГДА 3
ИНАЧЕ 4
КОНЕЦ КАК Поле1
ПоказатьРезультат: 1
(18) данные не будут получаться из таблиц при каждой итерации. Данные получаются с избытком, все которые соответствуют прямому отбору и теоретически могут быть нужны. И уже из полученных данных идет выбор нужных.
Соответственно для их получения составляется план выполнения запроса. И тут оптимизатор дает ошибку, так как не может составить этот план, так как на этом этапе не знает условий для ВЫБОР и пытается составить план с учетом получения всех подходящих данных.
Соответственно для их получения составляется план выполнения запроса. И тут оптимизатор дает ошибку, так как не может составить этот план, так как на этом этапе не знает условий для ВЫБОР и пытается составить план с учетом получения всех подходящих данных.
(1) Выполни в консоли и смотри результат.
У тебя может где-то 1 это цифра, а где-то строка "1". Визуально одинаково, по факту очень разные значения.
ВЫБРАТЬ А, Документ.Реквизит1, Документ2.Реквизит,
ВЫБОР
КОГДА А=1 Тогда Документ.Реквизит1
КОГДА А=2 Тогда Документ2.Реквизит
КОНЕЦ КАК НекийВыбор ИЗ...
У тебя может где-то 1 это цифра, а где-то строка "1". Визуально одинаково, по факту очень разные значения.
Собственно до сих пор не понимаю. Документ1, Документ2 - таблицы у которых есть столбцы - Реквизиты
В запросе судя по всему объединяются эти таблицы к некоторой третей основной. Если запрос построен так то вообще по сути все равно какие там условия - синтаксически это не ошибочная конструкция, синтаксической ошибки при выполнении запроса быть не должно в любом случае. Какой он результат выдаст это дело третье.
Или автор имеет в виду что он просто получает на выход результат второго условия вместо ожидаемого первого?
Опять же эта конструкция она действительно в запросе или в вычисляемых полях СКД?
В запросе судя по всему объединяются эти таблицы к некоторой третей основной. Если запрос построен так то вообще по сути все равно какие там условия - синтаксически это не ошибочная конструкция, синтаксической ошибки при выполнении запроса быть не должно в любом случае. Какой он результат выдаст это дело третье.
Или автор имеет в виду что он просто получает на выход результат второго условия вместо ожидаемого первого?
Опять же эта конструкция она действительно в запросе или в вычисляемых полях СКД?
(14) 1С поддерживает 2-а формата CASE: Но их больше. Например в MS SQL на вскидку есть ещё и такие:
COALESCE(p1, p2, p3, ..., pn) - Возвращает первое значение не равное NULL
IIF(<условие>, <Значение если условие выполняется>, <Значение если условие НЕ выполняется>) - допустимы вложенности. Примерно как языке в 1С, но не языке запросов ?(пол="м", 'Мужской'', "Женский").
CHOOSE (НомерДняНедели, 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресение')
ВЫБРАТЬ
т.Символ
,ВЫБОР
КОГДА т.Символ = "А" Тогда 1
КОГДА т.Символ = "Б" Тогда 2
...
ИНАЧЕ 99
КОНЕЦ как Поле1
,ВЫБОР т.Символ
КОГДА "А" Тогда 1
КОГДА "Б" Тогда 2
...
ИНАЧЕ 99
КОНЕЦ как Поле2
ИЗ ВТ как т
ПоказатьCOALESCE(p1, p2, p3, ..., pn) - Возвращает первое значение не равное NULL
IIF(<условие>, <Значение если условие выполняется>, <Значение если условие НЕ выполняется>) - допустимы вложенности. Примерно как языке в 1С, но не языке запросов ?(пол="м", 'Мужской'', "Женский").
CHOOSE (НомерДняНедели, 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота', 'Воскресение')