Сделать строки столбцов в SQL - PullRequest
0 голосов
/ 12 октября 2018

Я хочу сделать запрос в mysql для таблицы, содержащей более 60 столбцов, и перечислить эти столбцы по вертикали, чтобы их значения располагались горизонтально.Вроде как описать таблицу, но есть пара строк, перечисленных после каждого столбца вместо описания столбца.У таблицы есть загадочные 4-буквенные имена столбцов, и их слишком сложно понять с помощью таблицы описания и регулярных запросов.Я хочу описать таблицу и получить пару значений строки после них.По сути, просто повернув весь стол на 90 градусов против часовой стрелки.

Я искал вокруг и не могу найти простой способ сделать это.

-- basically, this would do:
SELECT * FROM BIG_TABLE LIMIT 2 ROTATE_LEFT 90;

COLUMN 1 | VALUE_1 | VALUE_2
COLUMN 2 | VALUE_1 | VALUE_2
COLUMN 3 | VALUE_1 | VALUE_2
COLUMN 4 | VALUE_1 | VALUE_2
COLUMN 5 | VALUE_1 | VALUE_2
COLUMN 6 | VALUE_1 | VALUE_2
COLUMN 7 | VALUE_1 | VALUE_2
COLUMN 8 | VALUE_1 | VALUE_2

-- instead of the normal:
SELECT * FROM BIG_TABLE LIMIT 2;

COLUMN 1 | COLUMN 2 | COLUMN 3 | COLUMN 4 | COLUMN 5 | COLUMN 6 ....
VALUE_1  | VALUE_1  | VALUE_1  | VALUE_1  | VALUE_1  | VALUE_1  ....
VALUE_2  | VALUE_2  | VALUE_2  | VALUE_2  | VALUE_2  | VALUE_2  ....

1 Ответ

0 голосов
/ 12 октября 2018

Предполагая, что типы данных всех шестидесяти столбцов совместимы, мы могли бы сделать что-то вроде этого.

 SELECT c.colname

      , CASE c.colname
        WHEN 'c1' THEN v1.`c1`
        WHEN 'c2' THEN v1.`c2`
        WHEN 'c3' THEN v1.`c3`
        WHEN 'c4' THEN v1.`c4`
        WHEN 'c5' THEN v1.`c5`
        ...
        END AS `value 1`

      , CASE c.colname
        WHEN 'c1' THEN v2.`c1`
        WHEN 'c2' THEN v2.`c2`
        WHEN 'c3' THEN v2.`c3`
        WHEN 'c4' THEN v2.`c4`
        WHEN 'c5' THEN v2.`c5`
        ...
        END AS `value 2`

   FROM ( SELECT 1 AS seq, 'c1' AS colname
          UNION ALL SELECT 2, 'c2'
          UNION ALL SELECT 3, 'c3'
          UNION ALL SELECT 4, 'c4'
          UNION ALL SELECT 5, 'c5'
          ...
         ) c
  CROSS
   JOIN ( SELECT * FROM BIG_TABLE ORDER BY ... LIMIT 0,1 ) v1
  CROSS
   JOIN ( SELECT * FROM BIG_TABLE ORDER BY ... LIMIT 1,1 ) v2
  ORDER
     BY c.seq

Обратите внимание, что имена столбцов (c1, c2, c3) должны бытьв жестком коде вместе с порядком их возврата.

Если нам нужно, чтобы имена столбцов были динамическими, нам понадобится отдельный оператор SQL для получения списка имен столбцов (information_schema.columns), а затем используйтеинформация, полученная для динамического построения оператора, как показано выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...