На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! информация о разделе
user posted imageДанный раздел предназначается для обсуждения вопросов использования баз данных, за исключением составления запросов на SQL. Для этого выделен специальный раздел. Убедительная просьба - соблюдать "Правила форума" и не пренебрегать "Правильным оформлением своих тем". Прежде, чем создавать тему, имеет смысл заглянуть в раздел "Базы данных: FAQ", возможно там уже есть ответ.

Модераторы: Chow, Bas, MIF
  
> Сократить бы запрос :-\
    Добрейшего времени суток!

    В результате составления запроса на очередную форму отчетности - получается не совсем красивая конструкция. Хотелось бы ее как-то оптимизировать.

    Приведу "синтетический" пример:
    ExpandedWrap disabled
      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";

    Результат:
    ExpandedWrap disabled
      ---------------------
      case1 | case2 | case3
      ---------------------
       1111 | 2222  | 3333
       *    | *     | *
       *    | *     | *
      ---------------------


    Но таких кэйзов 37 блоков, в каждом блоке 25 штук. Хотелось бы сократить в нечто подобное ниже, но это не работает. Вернее выполняется успешно, но результат не тот, что нужен:

    ExpandedWrap disabled
      SELECT
        CASE WHEN "Idx" = 1 THEN ('1111','2222','3333') ELSE ('*','*','*') END
      FROM generate_series(1,3) AS "Idx";


    Иными словами, можно ли одним кейзом генерировать несколько полей сразу?
      Не все так просто, как оказалось. На соседнем форуме присоветовали через регистрацию собственного составного типа делать.
      Примерно будет так (PostgreSQL):

      ExpandedWrap disabled
        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;


      Буду думать, нужно ли мне это. Или проще накопипастить кейзов :-?
        А какова область значений Idx? И какую задачу нужно решить на самом деле? Может, здесь применимы JOIN-ы со вспомогательной таблицей?
          Цитата AVA12 @
          А какова область значений Idx?

          Затрудняюсь сказать, это вообще условие, в ряде случаев составное. Я лучше приведу готовый уже пример запроса, который формирует полностью нужный мне отчет. Используется определенная мною ранее функция. Запрос выполняется за 0.8сек, пока это устраивает.
          Прикреплённый файлПрикреплённый файл06.sql (138,87 Кбайт, скачиваний: 270)
          Прикреплённый файлПрикреплённый файлfunc.sql (14,24 Кбайт, скачиваний: 267)
          Сообщение отредактировано: JoeUser -
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0297 ]   [ 18 queries used ]   [ Generated: 28.03.24, 23:36 GMT ]