我可以创建一个 SQL 查询,使 Col A 成为我的主要排序键,但如果该值不为 NULL,则 Col B 成为我的主要排序吗?

Can I create an SQL query such that Col A is my primary sort key but if the value is not NULL, Col B becomes my primary sort?

使用 MariaDB,我有一个提供信息的视图,包括事件日期和邀请是否已被接受。 eventdate 属于 date 类型,是事件的日期。 acceptedtinyint 类型,如果拒绝邀请则包含 0,如果已接受邀请则包含 1,否则默认为 NULL.

我想开发一个按 accepted 排序的查询,然后 eventdate 这样我的 NULL 值将出现在我列表的顶部eventdate订单。但是,如果 acceptedNOT NULL 那么我希望数据按 eventdate.

排序

我当前的查询是:

SELECT * FROM invite_view ORDER BY accepted, eventdate

但是,这会对 table 进行排序,因此所有 accepted = NULL 值排在第一位,所有 0 值排在第二位,最后,所有 1 值在最后,因此:

eventname | eventdate  | accepted
---------------------------------
Event 1   | 2022-04-14 | NULL
Event 2   | 2022-04-25 | NULL
Event 3   | 2022-03-28 | 0
Event 4   | 2022-05-03 | 0
Event 5   | 2022-04-14 | 1
Event 6   | 2022-05-01 | 1

我想要这样的东西:

eventname | eventdate  | accepted
---------------------------------
Event 1   | 2022-04-14 | NULL
Event 2   | 2022-04-25 | NULL
Event 3   | 2022-03-28 | 0
Event 5   | 2022-04-14 | 1
Event 6   | 2022-05-01 | 1
Event 4   | 2022-05-03 | 0

一种方法是使用 CASE 有条件地对结果进行排序

SELECT * 
FROM  invite_view 
ORDER BY CASE WHEN accepted IS NULL THEN accepted
              ELSE eventDate
         END

结果:

id eventname eventdate accepted
1 Event 1 2022-04-14 null
2 Event 2 2022-04-25 null
3 Event 3 2022-03-28 0
5 Event 5 2022-04-14 1
6 Event 6 2022-05-01 1
4 Event 4 2022-05-03 0

db<>fiddle here