按案例排序:值 LIKE,然后 POSITION
Sort By Case: Where value LIKE, then POSITION
我有一个结果集需要进行相应的排序:
- 如果列值类似于'Qwerty%',则将其放在顶部,然后按位置升序排序
- 如果列值为不像 'Qwerty%',则将其添加到上述'Qwerty%'结果集下,并按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;
这是使用 REGEXP
而不是 CASE
表达式的另一个稍微更简洁的查询版本:
SELECT NAME, POSITION
FROM TABLE_NAME
ORDER BY
NAME NOT REGEXP 'Qwerty',
POSITION;
我有一个结果集需要进行相应的排序:
- 如果列值类似于'Qwerty%',则将其放在顶部,然后按位置升序排序
- 如果列值为不像 'Qwerty%',则将其添加到上述'Qwerty%'结果集下,并按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;
这是使用 REGEXP
而不是 CASE
表达式的另一个稍微更简洁的查询版本:
SELECT NAME, POSITION
FROM TABLE_NAME
ORDER BY
NAME NOT REGEXP 'Qwerty',
POSITION;