Сложности с конструкциями IF/ELSE и CASE в MySql
Формулировка задачи:
Всем доброго.
Помогите допилить запрос. Необходимо что бы в зависимости от условия возвращало разные имена ячеки и ее значения.
SELECT h.street_id, `street_city_id` AS `city_id`,
IF(`city_id` > 1, 'obl', 'rai') AS CELL
CASE WHEN `city_id` > 1
THEN (SELECT `raion_id` FROM `raion` WHERE raion_id = city_raion_id)
ELSE (SELECT `raion_obl_id` FROM `raion_obl` WHERE raion_obl_id = city_raion_id)
END AS VAL
FROM `house` h
INNER JOIN `street` s ON h.street_id = s.street_id
INNER JOIN `city` c ON s.street_city_id = c.city_id
WHERE `house_id` = '11830'Решение задачи: «Сложности с конструкциями IF/ELSE и CASE в MySql»
textual
Листинг программы
CASE WHEN `city_id` > 1 THEN (SELECT `raion_id` FROM `raion` WHERE raion_id = city_raion_id) WHEN `city_id` <= 0 THEN (SELECT `raion_obl_id` FROM `raion_obl` WHERE raion_obl_id = city_raion_id) END AS VAL
Объяснение кода листинга программы
- В данном коде используется конструкция CASE WHEN, которая позволяет выполнить проверку условия и в зависимости от его истинности выбрать определенное значение.
- В первом условии (
city_id> 1) проверяется, больше ли значение переменнойcity_idединицы. Если это условие истинно, то выполняется запрос внутри скобок. - В запросе внутри скобок (
SELECTraion_idFROMraionWHERE raion_id = city_raion_id) выбирается значение переменнойraion_idиз таблицыraion, гдеraion_idравно значению переменнойcity_raion_id. - Во втором условии (
city_id<= 0) проверяется, меньше ли или равно значение переменнойcity_idнулю. Если это условие истинно, то выполняется запрос внутри скобок. - В запросе внутри скобок (
SELECTraion_obl_idFROMraion_oblWHERE raion_obl_id = city_raion_id) выбирается значение переменнойraion_obl_idиз таблицыraion_obl, гдеraion_obl_idравно значению переменнойcity_raion_id. - Результат выполнения запросов сохраняется в переменную
VAL. - Все эти действия выполняются при условии, что переменная
city_raion_idимеет значение, которое не равно нулю.