Вы можете использовать встроенное представление для своего реального запроса и добавить фиктивный столбец к каждой ветви;затем используйте это для заказа, но только выберите свой реальный столбец.Например:
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
...
но я думаю, что это облегчает обслуживание, как вы можете видеть, когда заголовки и столбцы не совпадают.