如何在mysql中获取小写首字母之类的数据?
How to get data like first capital by lower cases in mysql?
新 mysql,
我有一个table这样的。
___|____
Id | name
1 | a
2 | b
3 | c
4 | A
5 | B
6 | C
要在 sql
中获得这样的结果,需要执行什么查询
___|____
Id | name
4 | A
1 | a
5 | B
2 | b
6 | C
3 | c
这将根据您需要的顺序创建一个新列'newid'
select newid = row_number() over (order by case when val between 'A' and 'Z'
then ascii(val) -31
else ascii(val) end), *
from yourtable
这样试试。我刚刚使用了 w3schools 的数据库,需要检查在 MySql.
中是否有效
SELECT * FROM myTable GROUP BY name ORDER BY UPPER(name), LOWER(name);
已编辑
这似乎是将 DDS 理念转变为适用于所有 MySQL 版本的更通用工作理念的最简单方法..
查询
SELECT
id
, name
FROM
Table1
ORDER BY
CASE
WHEN name COLLATE latin1_bin BETWEEN 'A' AND 'Z'
THEN ASCII(name) + 31
ELSE ASCII(name)
END
结果
| id | name |
| --- | ---- |
| 4 | A |
| 1 | a |
| 5 | B |
| 2 | b |
| 6 | C |
| 3 | c |
Explaining View so you can see what happens on DB Fiddle
或更稳定的一个,因为 calculated_ascii_value 列的生成值是唯一的。
Explaining View so you can see what happens on DB Fiddle
另一个查询相当复杂..
查询
SELECT
Table1.id
, Table1.name
FROM (
SELECT
DISTINCT
(
SUBSTRING_INDEX(SUBSTRING_INDEX(@orderList, ',', number_generator.number), ',', -1)
COLLATE utf8mb4_bin
) AS letter
FROM (
SELECT
(@number := @number + 1) AS number
FROM (
SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) AS row_1
CROSS JOIN (
SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
) AS row_2
CROSS JOIN (SELECT @number := 0) AS init_user_param
) AS number_generator
CROSS JOIN (SELECT @orderList := 'A,a,B,b,C,c' /* add all to Z,z */) AS init_user_param
) AS letters
INNER JOIN
Table1
ON
letters.letter = Table1.name
;
结果
| id | name |
| --- | ---- |
| 4 | A |
| 1 | a |
| 5 | B |
| 2 | b |
| 6 | C |
| 3 | c |
注意有些事情你应该知道
当您的 MySQL 使用 utf8 字符集时,COLLATE utf8mb4_bin
可能会更改为 COLLATE utf8_bin
。
并且 SELECT @orderList := 'A,a,B,b,C,c' /* add all to Z,z */
您可能需要添加更多到 Z,z
新 mysql,
我有一个table这样的。
___|____
Id | name
1 | a
2 | b
3 | c
4 | A
5 | B
6 | C
要在 sql
中获得这样的结果,需要执行什么查询___|____
Id | name
4 | A
1 | a
5 | B
2 | b
6 | C
3 | c
这将根据您需要的顺序创建一个新列'newid'
select newid = row_number() over (order by case when val between 'A' and 'Z'
then ascii(val) -31
else ascii(val) end), *
from yourtable
这样试试。我刚刚使用了 w3schools 的数据库,需要检查在 MySql.
中是否有效SELECT * FROM myTable GROUP BY name ORDER BY UPPER(name), LOWER(name);
已编辑
这似乎是将 DDS 理念转变为适用于所有 MySQL 版本的更通用工作理念的最简单方法..
查询
SELECT
id
, name
FROM
Table1
ORDER BY
CASE
WHEN name COLLATE latin1_bin BETWEEN 'A' AND 'Z'
THEN ASCII(name) + 31
ELSE ASCII(name)
END
结果
| id | name |
| --- | ---- |
| 4 | A |
| 1 | a |
| 5 | B |
| 2 | b |
| 6 | C |
| 3 | c |
Explaining View so you can see what happens on DB Fiddle
或更稳定的一个,因为 calculated_ascii_value 列的生成值是唯一的。 Explaining View so you can see what happens on DB Fiddle
另一个查询相当复杂..
查询
SELECT
Table1.id
, Table1.name
FROM (
SELECT
DISTINCT
(
SUBSTRING_INDEX(SUBSTRING_INDEX(@orderList, ',', number_generator.number), ',', -1)
COLLATE utf8mb4_bin
) AS letter
FROM (
SELECT
(@number := @number + 1) AS number
FROM (
SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) AS row_1
CROSS JOIN (
SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6
) AS row_2
CROSS JOIN (SELECT @number := 0) AS init_user_param
) AS number_generator
CROSS JOIN (SELECT @orderList := 'A,a,B,b,C,c' /* add all to Z,z */) AS init_user_param
) AS letters
INNER JOIN
Table1
ON
letters.letter = Table1.name
;
结果
| id | name |
| --- | ---- |
| 4 | A |
| 1 | a |
| 5 | B |
| 2 | b |
| 6 | C |
| 3 | c |
注意有些事情你应该知道
当您的 MySQL 使用 utf8 字符集时,COLLATE utf8mb4_bin
可能会更改为 COLLATE utf8_bin
。
并且 SELECT @orderList := 'A,a,B,b,C,c' /* add all to Z,z */
您可能需要添加更多到 Z,z