按案例排序:值 LIKE,然后 POSITION

Sort By Case: Where value LIKE, then POSITION

我有一个结果集需要进行相应的排序:

例如结果集如下:

 NAME                |    POSITION
 ---------------------------------
 entitlement         |    4
 threaten            |    1
 Qwerty Name         |    1
 Qwerty architecture |    7
 drown               |    6
 expectation         |    2
 clash               |    3
 foot                |    7
 ask                 |    10
 Qwerty structure    |    11
 Qwerty therapist    |    3

应按顺序返回:

 NAME                |    POSITION
 ---------------------------------
 Qwerty Name         |    1
 Qwerty therapist    |    3
 Qwerty architecture |    7
 Qwerty structure    |    11
 threaten            |    1
 expectation         |    2
 clash               |    3
 entitlement         |    4
 drown               |    6
 foot                |    7
 ask                 |    10

到目前为止我已经想到了这个:

SELECT NAME, POSITION FROM TABLE_NAME
ORDER BY CASE NAME
    WHEN NAME LIKE 'Qwerty%' THEN CONCAT('A', NAME)
    ELSE POSITION END

但是结果集返回错误如下

 NAME                |    POSITION
 ---------------------------------
 Qwerty Name         |    1
 Qwerty structure    |    11
 Qwerty therapist    |    3
 Qwerty architecture |    7
 threaten            |    1
 drown               |    6
 expectation         |    2
 ask                 |    10
 foot                |    7
 clash               |    3
 entitlement         |    4

如您所见,没有对其中没有 'Qwerty%' 的名称进行排序,并且没有按 POSITION 正确排序。

试试这个:

SELECT NAME, POSITION, SUM (CASE WHEN NAME LIKE 'Qwerty%' THEN 0 ELSE 1 END) AS Sort
FROM TABLE_NAME
ORDER BY Sort, POSITION

您的 ORDER BY 子句中需要 两个 排序级别:

SELECT NAME, POSITION
FROM TABLE_NAME
ORDER BY
    CASE WHEN NAME LIKE 'Qwerty%' THEN 0 ELSE 1 END,
    POSITION;

Demo

这是使用 REGEXP 而不是 CASE 表达式的另一个稍微更简洁的查询版本:

SELECT NAME, POSITION
FROM TABLE_NAME
ORDER BY
    NAME NOT REGEXP 'Qwerty',
    POSITION;