排序方式: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;