SQL - ORDER BY с жестко закодированными значениями UNIONed? - PullRequest
0 голосов
/ 25 мая 2018

Вот немного псевдокода, чтобы объяснить, что я пытаюсь сделать:

SELECT
'"'|| 'ID' ||'"' ||','||
'"'|| 'FIRST_NAME' ||'"' ||','||
'"'|| 'LAST_NAME' ||'"'
FROM DUAL
UNION
SELECT   
'"'|| ID ||'"' ||','||
'"'|| FIRST_NAME ||'"' ||','||
'"'|| LAST_NAME || ' " '
FROM TEMP_TABLE;

Я создаю файл CSV и мне нужно жестко закодировать имена моих столбцов, чтобы при импорте пользователем CSVфайл в Excel, столбцы и данные будут отображаться правильно.

Как мне обеспечить, чтобы первая половина запроса - имена столбцов - отображалась первой в этом файле CSV?Предложение ORDER BY возвращает ошибку, предположительно потому, что первая половина запроса не определяет имена столбцов, поэтому заказывать нечего.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Вы можете жестко закодировать значение и использовать его для сортировки.

SELECT Col
FROM (
SELECT
'"'|| 'ID' ||'"' ||','||
'"'|| 'FIRST_NAME' ||'"' ||','||
'"'|| 'LAST_NAME' ||'"' AS Col,
1 AS Sort
FROM DUAL
UNION
SELECT   
'"'|| ID ||'"' ||','||
'"'|| FIRST_NAME ||'"' ||','||
'"'|| LAST_NAME || ' " ',
2
FROM TEMP_TABLE) Table1
ORDER BY Sort ASC
0 голосов
/ 25 мая 2018

Вы можете использовать встроенное представление для своего реального запроса и добавить фиктивный столбец к каждой ветви;затем используйте это для заказа, но только выберите свой реальный столбец.Например:

SELECT csv
FROM (
  SELECT 1 AS order_col,
  '"'|| 'ID' ||'"' ||','||
  '"'|| 'FIRST_NAME' ||'"' ||','||
  '"'|| 'LAST_NAME' ||'"' AS csv
  FROM DUAL
  UNION
  SELECT 2, 
  '"'|| ID ||'"' ||','||
  '"'|| FIRST_NAME ||'"' ||','||
  '"'|| LAST_NAME || ' " '
  FROM TEMP_TABLE
)
ORDER BY order_col, csv;

Или вы можете искать фиксированные значения в выражении регистра, которое также требует встроенного просмотра и является более повторяющимся:

SELECT csv
FROM (
  SELECT
  '"'|| 'ID' ||'"' ||','||
  '"'|| 'FIRST_NAME' ||'"' ||','||
  '"'|| 'LAST_NAME' ||'"' AS csv
  FROM DUAL
  UNION
  SELECT   
  '"'|| ID ||'"' ||','||
  '"'|| FIRST_NAME ||'"' ||','||
  '"'|| LAST_NAME || ' " '
  FROM TEMP_TABLE
)
ORDER BY CASE WHEN csv = '"ID","FIRST_NAME","LAST_NAME"' THEN 1 ELSE 2 END, csv;

Не имеет значения, но вашей первой ветви не требуется вся эта конкатенация ...

...
  SELECT 1 AS order_col,
  '"ID","FIRST_NAME","LAST_NAME"' AS csv
  FROM DUAL
...

но я думаю, что это облегчает обслуживание, как вы можете видеть, когда заголовки и столбцы не совпадают.

...