Mysql 按大小写排序:如值,则按位置排序
我有一个需要相应排序的结果集:Mysql 按大小写排序:如值,则按位置排序,mysql,sql-order-by,Mysql,Sql Order By,我有一个需要相应排序的结果集: 如果列值类似于“Qwerty%”,请将其置于顶部,然后按位置升序排序 如果列值与“Qwerty%”不同,请将其添加到上述“Qwerty%”结果集中,并按位置升序排列 例如,结果集如下所示: NAME | POSITION --------------------------------- entitlement | 4 threaten | 1 Qwerty Nam
- 如果列值类似于“Qwerty%”,请将其置于顶部,然后按位置升序排序
- 如果列值与“Qwerty%”不同,请将其添加到上述“Qwerty%”结果集中,并按位置升序排列
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%”的名称进行排序,并且没有按位置正确排序的名称也没有进行排序。尝试以下操作:
SELECT NAME, POSITION, SUM (CASE WHEN NAME LIKE 'Qwerty%' THEN 0 ELSE 1 END) AS Sort
FROM TABLE_NAME
ORDER BY Sort, POSITION
在orderby
子句中需要两个排序级别:
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;
非常感谢你。关于ReGEXP版本与案例版本,你会考虑哪两个更快?这两种方法都有什么优点/缺点?@DaveO'Dwyer很抱歉延迟回复。我不确定哪一个会在性能方面获胜,但是
LIKE
和REGEXP
在功能上做得非常相似。他们都从一开始就扫描名称字符串,寻找某个前缀。