Условный оператор в запросе
Оператор ВЫБОР используется в случаях когда нам необходимо различное поведение в зависимости от возникших условий.
Примеры
К примеру, если значение поля Дата выпадает на день программиста (256-ой день в году), или на 31-ое декабря то выведем соответствующее поздравление. А если на любое другое число, выведем что ни будь нейтральное.
КОГДА ДЕНЬГОДА ( &ТекущаяДата ) = 256
ТОГДА "Поздравляю с днем программиста!"
КОГДА МЕСЯЦ ( &ТекущаяДата ) = 12
И ДЕНЬ ( &ТекущаяДата ) = 31
ТОГДА "Поздравляю с наступающим новым годом!"
ИНАЧЕ "Сегодня нет праздника"
КОНЕЦ КАК Сообщение
Синтаксис оператора ВЫБОР:
ВЫБОР
КОГДА <ЛогическоеВыражение> ТОГДА <ВыражениеДляИстина>
ИНАЧЕ <ВыражениеДляЛожь>
КОНЕЦ
В рамках операции ВЫБОР может быть описано какое угодно количество логических условий "КОГДА . ТОГДА. " в том числе и вложенных.
Так же существует и второй вариант синтаксиса, когда мы хотим проверить элементы только на равенство, не используя других функций и операторов сравнения.
Мы можем указать сравниваемое значение прямо после слова "ВЫБОР", а в когда помещать сами значения. К примеру у нас есть значение количества в таблице, и мы хотим с помощью запроса определить, что количество товара равно 1 и пометить эти строки в результате запроса:
1с выбор когда в запросе
Войдите как ученик, чтобы получить доступ к материалам школы
Язык запросов 1С 8.3 для начинающих программистов: условный оператор
Автор уроков и преподаватель школы: Владимир Милькин
Условный оператор в запросе
Давайте напишем запрос, который получает названия и калорийность еды:
А теперь добавим в результат запроса колонку, в которую будем выводить жирность еды по следующим правилам:
- если калорийность меньше 100, то жирность низкая;
- если калорийность от 100 до 200, то жирность нормальная;
- если калорийность больше 200, то жирность высокая.
Как этого можно добиться, ведь в таблице Справочник.Еда нет колонки Жирность?
Оказывается, эту колонку мы можем добавить сами, используя условный оператор внутри запроса:
Давайте внимательнее присмотримся к тексту запроса:
В секции ВЫБРАТЬ идёт перечисление полей выборки: Наименование, Калорийность, а затем вместо третьего поля идёт конструкция условного оператора, результат которого и попадает в третью колонку.
Условия оператора обрабатываются последовательно . Если одно из них оказалось верным, то в качестве результата возвращается соответствующее значение. Если же ни одно из условий не выполнилось, то возвращается значение из секции ИНАЧЕ. Если же ни одно из условий не выполнилось, и в операторе отсутствует секция ИНАЧЕ, то возвращается значение NULL (о нём мы поговорим в одном из следующих уроков).
Поэтому новый запрос вернёт такую таблицу:
Отступление
Обратите внимание, что третья колонка в таблице, которую вернул запрос, называется Поле1. Это имя было сгенерировано системой автоматически, потому что третьей колонке не соответствует никакого реального поля в таблице Справочник.Еда, откуда можно было бы это имя получить.
Но в наших силах дать ей это имя. Для этого сразу после описания поля нужно написать ключевое слово КАК, а после этого через пробел указать само имя. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Такое имя будет называться псевдонимом поля .
Псевдонимы можно присваивать любым полям, в том числе тем, у которых уже есть имя. Давайте сделаем псевдоним Еда для поля Наименование:
Но вернёмся к условному оператору в запросах.
Более сложные логические выражения в условиях оператора
В логических условиях оператора выбора можно использовать и более сложные выражения.
Пример использования логического оператора ПОДОБНО:
Пример использования функции ПОДСТРОКА:
Более сложные результаты условного оператора
Конечно, результатом условного оператора может быть не только константная строка, но и любое другое выражение, допустимое в запросе.
Запрос. ВЫБОР КОГДА
ВЫБРАТЬ
.
ВЫБОР
КОГДА условие1
ТОГДА значение1
КОГДА условие2
ТОГДА значение2
КОГДА (ВЫБРАТЬ
..
ИЗ ..) = ИСТИНА
ТОГДА значение3
ИНАЧЕ значение4
..
ИЗ
..
то есть в одном из полей использовать запрос?
(1) Че за ерунда, можно канечно.
Обычная конструкция SELECT CASE
Пробую написать в конструкторе в поле
ВЫБОР
КОГДА
ТОГДА
КОГДА
ТОГДА
КОГДА
ТОГДА
КОГДА
ТОГДА
КОГДА ЕСТЬNULL(выбрать 1 из истина, ЛОЖЬ) = ИСТИНА
ТОГДА МАКСИМУМ(ВложенныйЗапросНДФЛ.Сумма)
ИНАЧЕ 0
КОНЕЦ
ругается на то, что синтаксическая ошибка и "ожидается выражение выбрать"..
(2) почитай топик внимательно.
(3) в КОГДА так нельзя
(3) Может я неправильно понял тебя))
Вот как ты написал в примере правильно сказано в (1).
(3) > выбрать 1 из истина
(6) Давай обратимся к матчасти:
В качестве описания поля выборки может быть выражение, использующее следующие элементы:
Литералы типов: число, строка (в кавычках), булево (значения Истина и Ложь), Null, Неопределено. [Замечание: Чтобы указать литерал типа "дата", можно воспользоваться ключевым словом языка запросов ДАТАВРЕМЯ или передать дату через параметр запроса].
Параметры запроса (со знаком &)
Имя поля
Имя табличной части
Разыменование ссылочного поля (через одну или несколько точек)
Арифметические операции (+, -, /, *) [Замечание: операция получения остатка % в языке запросов не поддерживается]
Операция конкатенации строк (+) [Замечание: операцию конкатенации нельзя использовать для виртуальных полей]
Встроенные функции языка запросов (ДЕНЬ, МЕСЯЦ, ГОД и т.д.)
Агрегатные функции (СУММА, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, КОЛИЧЕСТВО)
Операция выбора ВЫБОР / CASE — позволяет получить одно из возможных значений в соответствии с указанными условиями.
Операция приведения типов ВЫРАЗИТЬ / CAST
(10) "Можно только IN (SELECT)" — то есть, что то вроде этого
ВЫБОР
КОГДА
ТОГДА 1
КОГДА
ТОГДА 2
КОГДА
ТОГДА 3
КОГДА
ТОГДА 4
КОГДА ИСТИНА В (ВЫБРАТЬ .. ИЗ ..)
ТОГДА 5
ИНАЧЕ 0
КОНЕЦ
Условия в запросе
Эти операторы возможно использовать во всех 4 ситуациях, но контекст (окружаемые переменные у них отличаются).
В первых двух случаях условия накладываются на поля выборки, например:
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК СпрКонтрагенты ГДЕ СпрКонтрагенты.ИНН<>»»
Обращение идет через имя таблицы (в простых запросах может опускаться, но в сложных может вызывать неоднозначность поля).
Данное условие вызывает ограничение выборки (обычно уменьшает ее)
В конструкторе запроса находятся на вкладке условия:
В произвольном варианте пишется текстом, в обычном выбирается поле, оператор сравнения и значение:
ВЫБОР КОГДА
Этот условный оператор используется для преобразования значения, ограничивает же выборку только когда расположен после служебного слова ГДЕ.
Допустимо несколько подчиненных условий. Может находится в полях выборки, полях условий ГДЕ, группировок, итогов (универсальный оператор для сложных условий)
Например, так выглядит вариант преобразования:
ВЫБРАТЬ
ВЫБОР
КОГДА 1 = 2
ТОГДА «Никогда не будет истиной»
КОГДА 1 = 1
ТОГДА «Всегда будет истиной»
ИНАЧЕ ДАТАВРЕМЯ(1, 1, 1)
КОНЕЦ КАК ПолеПредставленияЗначения
Вариант использования в условии ГДЕ, результат выборки должен возвращать булево значение либо сравниваться с чем-то еще
Пример № 1
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК К ГДЕ ВЫБОР КОГДА К.ИНН = «» ТОГДА ЛОЖЬ ИНАЧЕ ИСТИНА КОНЕЦ
Пример № 2:
ВЫБРАТЬ Ссылка ИЗ Справочник.Контрагенты КАК К ГДЕ ВЫБОР КОГДА К.ИНН = «» ТОГДА «» ИНАЧЕ «Заполнено» КОНЕЦ = «Заполнено»
Параметры виртуальных таблиц
В данном случае оперирование идет с полями таблиц, например ресурсами, измерениями, реквизитами. В этих условиях обращение идет без точки (контекст этого не требует).
ВЫБРАТЬ * ИЗ РегистрСведений.КурсыВалют.СрезПоследних(, Валюта.Код = «RUR»)
В конструкторе запроса они находятся вот здесь:
Стоит отметить, что обычно используется ограничение над измерениями, так как иначе условие отнесется к выборке для получения, а не на сам результат (на ресурсы ограничения следует наложить в операторе ГДЕ, чтобы получить ожидаемый результат).
Накладывание условия в запросе на измерения, если нет обращения через точку (как в примере выше), ускоряет выборку: на больших таблицах, это будет визуально заметно; на небольших можно использовать как удобно.
ИМЕЮЩИЕ
Для наложения отбора для результата «группировочных» функции
ВЫБРАТЬ
Контрагенты.ИНН,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) КАК Ссылка
ИЗ
Справочник.Контрагенты КАК Контрагенты
СГРУППИРОВАТЬ ПО
Контрагенты.ИНН
ИМЕЮЩИЕ
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Контрагенты.Ссылка) > 1 И
Контрагенты.ИНН <> «»
В данную выборку попадут дубли ИНН, когда оно вообще заполнено.
В конструкторе запроса также находится на вкладке условия
В этой конструкции также возможно использование «группировочных» операторов И,ИЛИ, но сравнивать можно с константами запроса, с функцией или значением, входящим в группировку (другие реквизиты справочника в данном примере не будут доступны для сравнения -> тогда следует использовать ГДЕ).
Реклама – самая интересная и самая трудная форма литературы.
— Олдос Хаксли.