排序方式:ABC 前的特殊字符
Order by: Special characters before ABC
我有这个 sql:
SELECT -1 AS ID, '(None)' AS NAME
FROM TABLE_1 WHERE ID=1
UNION
SELECT ID, NAME
FROM TABLE_2
ORDER BY 2
Table data:
ID | NAME
1 | Direct
2 | Personal
3 | Etc
所以如果我在 Oracle 10 中执行此 sql 它 returns 这些:
Result:
ID | NAME
1 | Direct
3 | Etc
-1 | (None)
2 | Personal
如何将“(None)”排在最前面?
如果我使用
' (None) ' as Name
而不是
'(None)' as Name
有效,因为 (None) 之前的 space,但这不是解决方案。
您可以添加一个虚拟列ORDER_COL
,然后在该列上订购
select ID, NAME from
(
SELECT -1 AS ID, '(None)' AS NAME, 1 as ORDER_COL FROM TABLE_1 WHERE ID=1
UNION
SELECT ID, NAME, 2 as ORDER_COL FROM TABLE_2
)
order by ORDER_COL, NAME;
试试这个。 NULLS LAST
是 Oracle 中升序的默认值。使其成为“(None)”的 NULLS FIRST
。此外,使用 UNION ALL
因为 UNION
会删除重复项并且效率较低。
SELECT *
FROM (
SELECT -1 AS ID
,'(None)' AS NAME
FROM TABLE_1
WHERE ID = 1
UNION ALL
SELECT ID
,NAME
FROM TABLE_2
)
ORDER BY CASE
WHEN NAME = '(None)'
THEN NULL
ELSE NAME -- or id if you want
END NULLS FIRST;
我有这个 sql:
SELECT -1 AS ID, '(None)' AS NAME
FROM TABLE_1 WHERE ID=1
UNION
SELECT ID, NAME
FROM TABLE_2
ORDER BY 2
Table data:
ID | NAME
1 | Direct
2 | Personal
3 | Etc
所以如果我在 Oracle 10 中执行此 sql 它 returns 这些:
Result:
ID | NAME
1 | Direct
3 | Etc
-1 | (None)
2 | Personal
如何将“(None)”排在最前面?
如果我使用
' (None) ' as Name
而不是
'(None)' as Name
有效,因为 (None) 之前的 space,但这不是解决方案。
您可以添加一个虚拟列ORDER_COL
,然后在该列上订购
select ID, NAME from
(
SELECT -1 AS ID, '(None)' AS NAME, 1 as ORDER_COL FROM TABLE_1 WHERE ID=1
UNION
SELECT ID, NAME, 2 as ORDER_COL FROM TABLE_2
)
order by ORDER_COL, NAME;
试试这个。 NULLS LAST
是 Oracle 中升序的默认值。使其成为“(None)”的 NULLS FIRST
。此外,使用 UNION ALL
因为 UNION
会删除重复项并且效率较低。
SELECT *
FROM (
SELECT -1 AS ID
,'(None)' AS NAME
FROM TABLE_1
WHERE ID = 1
UNION ALL
SELECT ID
,NAME
FROM TABLE_2
)
ORDER BY CASE
WHEN NAME = '(None)'
THEN NULL
ELSE NAME -- or id if you want
END NULLS FIRST;