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
在功能上做得非常相似。他们都从一开始就扫描名称字符串,寻找某个前缀。