Нужно добавить в выборку данных столбец с результатами проверки на определенное условие
Помогите дописать SQL запрос.
Имеется выборка из нескольких таблиц. В неё необходимо добавить ещё один столбец вида:
если выполняется условие:
select * from table_name a where pkg_name.fnc_name(a.vl_field,1238)=1, то в колонку в соответствующую строку записать строковое значение 'Значение 1'.
если существует связка:
select * from table_name1 a join table_name2 d on d.same_name1 = a.same_name and d.same_name2 = 1, то записать 'Значение 2'
иначе в соответствующую строку записать 'Значение 3'
Как я понимаю, здесь нужно использовать конструкцию case when then, но мне не понятно как добавить результат выполнения данной конструкции в свою уже составленную выборку в качестве столбца.
Подскажите, как подобные запросы писать? Должен же быть какой-то используемый шаблон в таких случаях?
Ответы (1 шт):
как подобные запросы писать? Должен же быть какой-то используемый шаблон в таких случаях?
Не без того...
Сначала смотрим результат связывания таблиц с выводом всех полей и определяем, можно ли на основании их значений для записи посчитать требуемое выражение. Если да - просто добавляем его как ещё одно вычисляемое поле, если нет - либо корректируем источник данных запроса, чтобы такая возможность появилась (и при этом не пострадали остальные результаты - особенно следует избегать кратного умножения при связывании), либо используем коррелированный подзапрос. Возможно, какие-то предрасчёты можно произвести в CTE (особенно в случае опасности кратного умножения - используя отборы и агрегаты, следует получить строго одну запись добавляемого источника данных на каждую суммарную запись текущего запроса).
Соответствующие шаблоны:
- В "плоском" запросе.
SELECT *, -- существующие поля вывода
CASE WHEN {condition} THEN {value for TRUE} ELSE {value for FALSE} END fieldname
FROM -- "хвост" запроса
- В агрегирующем запросе (в обоих подвариантах может использоваться как агрегатная, так и оконная версия функции).
2.1. Вывод значения по приоритету:
SELECT *, -- существующие поля вывода
MAX(CASE WHEN {condition} THEN {value for TRUE} ELSE {value for FALSE} END) fieldname
FROM -- "хвост" запроса
2.2. Вывод значения по факту наличия:
SELECT *, -- существующие поля вывода
COUNT(CASE WHEN {condition} THEN 1 END) fieldname
FROM -- "хвост" запроса
PS. А для конкретного ответа - нужен как минимум текст запроса. А ещё лучше - плюс структуры исходных таблиц, пример текущего вывода и пример требуемого результата на тех же исходных данных.