Нужно добавить в выборку данных столбец с результатами проверки на определенное условие

Помогите дописать 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 шт):

Автор решения: Akina

как подобные запросы писать? Должен же быть какой-то используемый шаблон в таких случаях?

Не без того...

Сначала смотрим результат связывания таблиц с выводом всех полей и определяем, можно ли на основании их значений для записи посчитать требуемое выражение. Если да - просто добавляем его как ещё одно вычисляемое поле, если нет - либо корректируем источник данных запроса, чтобы такая возможность появилась (и при этом не пострадали остальные результаты - особенно следует избегать кратного умножения при связывании), либо используем коррелированный подзапрос. Возможно, какие-то предрасчёты можно произвести в CTE (особенно в случае опасности кратного умножения - используя отборы и агрегаты, следует получить строго одну запись добавляемого источника данных на каждую суммарную запись текущего запроса).

Соответствующие шаблоны:

  1. В "плоском" запросе.
SELECT *, -- существующие поля вывода
       CASE WHEN {condition} THEN {value for TRUE} ELSE {value for FALSE} END fieldname
FROM -- "хвост" запроса
  1. В агрегирующем запросе (в обоих подвариантах может использоваться как агрегатная, так и оконная версия функции).

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. А для конкретного ответа - нужен как минимум текст запроса. А ещё лучше - плюс структуры исходных таблиц, пример текущего вывода и пример требуемого результата на тех же исходных данных.

→ Ссылка