Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Базы данных: Общие вопросы > Сократить бы запрос :-\ |
Автор: JoeUser 04.08.15, 14:25 |
Добрейшего времени суток! В результате составления запроса на очередную форму отчетности - получается не совсем красивая конструкция. Хотелось бы ее как-то оптимизировать. Приведу "синтетический" пример: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> SELECT CASE WHEN "Idx" = 1 THEN '1111' ELSE '*' END, CASE WHEN "Idx" = 1 THEN '2222' ELSE '*' END, CASE WHEN "Idx" = 1 THEN '3333' ELSE '*' END FROM generate_series(1,3) AS "Idx"; Результат: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> --------------------- case1 | case2 | case3 --------------------- 1111 | 2222 | 3333 * | * | * * | * | * --------------------- Но таких кэйзов 37 блоков, в каждом блоке 25 штук. Хотелось бы сократить в нечто подобное ниже, но это не работает. Вернее выполняется успешно, но результат не тот, что нужен: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> SELECT CASE WHEN "Idx" = 1 THEN ('1111','2222','3333') ELSE ('*','*','*') END FROM generate_series(1,3) AS "Idx"; Иными словами, можно ли одним кейзом генерировать несколько полей сразу? |
Автор: JoeUser 04.08.15, 16:51 |
Не все так просто, как оказалось. На соседнем форуме присоветовали через регистрацию собственного составного типа делать. Примерно будет так (PostgreSQL): <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> CREATE TYPE foot AS (f1 text, f2 text, f3 text); SELECT (Field).* FROM ( SELECT CASE WHEN "Idx" = 1 THEN ('1111','2222','3333')::foot ELSE ('*','*','*')::foot END as Field FROM generate_series(1,3) AS "Idx" ) as Fields; Буду думать, нужно ли мне это. Или проще накопипастить кейзов |
Автор: AVA12 06.08.15, 11:07 |
А какова область значений Idx? И какую задачу нужно решить на самом деле? Может, здесь применимы JOIN-ы со вспомогательной таблицей? |
Автор: JoeUser 06.08.15, 17:28 |
Затрудняюсь сказать, это вообще условие, в ряде случаев составное. Я лучше приведу готовый уже пример запроса, который формирует полностью нужный мне отчет. Используется определенная мною ранее функция. Запрос выполняется за 0.8сек, пока это устраивает. 06.sql (, : 271) func.sql (, : 267) |