SQL - 使用 UNION 硬编码值的 ORDER BY?
SQL - ORDER BY with UNIONed hardcoded values?
这里有一些伪代码来解释我正在尝试做的事情:
SELECT
'"'|| 'ID' ||'"' ||','||
'"'|| 'FIRST_NAME' ||'"' ||','||
'"'|| 'LAST_NAME' ||'"'
FROM DUAL
UNION
SELECT
'"'|| ID ||'"' ||','||
'"'|| FIRST_NAME ||'"' ||','||
'"'|| LAST_NAME || ' " '
FROM TEMP_TABLE;
我正在创建一个 CSV 文件,我必须对列名称进行硬编码,以便当用户将 CSV 文件导入 Excel 时,列和数据将正确显示。
如何确保查询的前半部分(列名)首先出现在该 CSV 文件中? ORDER BY 子句会返回一个错误,大概是因为查询的前半部分没有定义列名,所以没有要排序的东西。
您可以为真正的查询使用内联视图,并为每个分支添加一个虚拟列;然后将其用于订购,但仅 select 您的真实专栏。例如:
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;
或者您可以在 case 表达式中查找固定值,这也需要内联视图,并且重复性更高:
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
...
但我想这会使维护更容易,正如您在标题和列不匹配时看到的那样。
您可以对值进行硬编码并使用它进行排序。
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
这里有一些伪代码来解释我正在尝试做的事情:
SELECT
'"'|| 'ID' ||'"' ||','||
'"'|| 'FIRST_NAME' ||'"' ||','||
'"'|| 'LAST_NAME' ||'"'
FROM DUAL
UNION
SELECT
'"'|| ID ||'"' ||','||
'"'|| FIRST_NAME ||'"' ||','||
'"'|| LAST_NAME || ' " '
FROM TEMP_TABLE;
我正在创建一个 CSV 文件,我必须对列名称进行硬编码,以便当用户将 CSV 文件导入 Excel 时,列和数据将正确显示。
如何确保查询的前半部分(列名)首先出现在该 CSV 文件中? ORDER BY 子句会返回一个错误,大概是因为查询的前半部分没有定义列名,所以没有要排序的东西。
您可以为真正的查询使用内联视图,并为每个分支添加一个虚拟列;然后将其用于订购,但仅 select 您的真实专栏。例如:
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;
或者您可以在 case 表达式中查找固定值,这也需要内联视图,并且重复性更高:
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
...
但我想这会使维护更容易,正如您在标题和列不匹配时看到的那样。
您可以对值进行硬编码并使用它进行排序。
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