Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Цитата AVA12 @
А какова область значений Idx?

Затрудняюсь сказать, это вообще условие, в ряде случаев составное. Я лучше приведу готовый уже пример запроса, который формирует полностью нужный мне отчет. Используется определенная мною ранее функция. Запрос выполняется за 0.8сек, пока это устраивает.
06.sql (, : 271)
func.sql (, : 267)

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)