首页 > 解决方案 > 为什么在 MySQL 中排序时 reg 表达式匹配不起作用?

问题描述

这个问题可以认为与有关。如果我有同一张桌子:

ID 姓名 分数
1 阿什利 81
2 萨曼莎 75
3 贝尔维特 84
4 朱莉娅 76

我想对最后三个字符进行排序,那么为什么这个查询不起作用:

SELECT DISTINCT Name FROM students
    where Marks > 75
    ORDER BY Name regexp "[a-z]{3}$" ASC;

排序时正则表达式有效吗?当我运行此查询时,我没有收到任何错误,但也没有排序。我得到的是:

标签: mysqlsql

解决方案


所有值都与模式匹配。

with students (id, name, marks) as(
select 1,   'Ashley',  81 from dual union all
select 2,   'Samantha',    75 from dual union all
select 3,   'Belvet',  84 from dual union all
select 4,   'Julia' ,  76 from dual)
SELECT *, 
       Name regexp "[a-z]{3}$" AS ordering_expression 
FROM students
ORDER BY Name regexp "[a-z]{3}$" ASC;
编号 | 姓名 | 标记| 排序表达式
-: | :------- | ----: | ------------------:
 1 | 阿什利 | 81 | 1
 2 | 萨曼莎 | 75 | 1
 3 | 贝尔维特 | 84 | 1
 4 | 朱莉娅 | 76 | 1

所以行没有排序。

-- test 6-letter pattern
with students (id, name, marks) as(
select 1,   'Ashley',  81 from dual union all
select 2,   'Samantha',    75 from dual union all
select 3,   'Belvet',  84 from dual union all
select 4,   'Julia' ,  76 from dual)
SELECT *, 
       Name regexp "[a-z]{6}$" AS ordering_expression 
FROM students
ORDER BY Name regexp "[a-z]{6}$" ASC;
编号 | 姓名 | 标记| 排序表达式
-: | :------- | ----: | ------------------:
 4 | 朱莉娅 | 76 | 0
 1 | 阿什利 | 81 | 1
 2 | 萨曼莎 | 75 | 1
 3 | 贝尔维特 | 84 | 1

db<>在这里摆弄


'Ashley' 应该排在第一位,因为 'ley' < 'lia'。– shiv_90

with students (id, name, marks) as(
select 1,   'Ashley',  81 from dual union all
select 2,   'Samantha',    75 from dual union all
select 3,   'Belvet',  84 from dual union all
select 4,   'Julia' ,  76 from dual)
SELECT *
FROM students
ORDER BY RIGHT(Name, 3) ASC;
编号 | 姓名 | 分数
-: | :------- | ----:
 1 | 阿什利 | 81
 4 | 朱莉娅 | 76
 2 | 萨曼莎 | 75
 3 | 贝尔维特 | 84

db<>在这里摆弄


推荐阅读