[英]How to get data like first capital by lower cases in mysql?
New to mysql, mysql的新手,
I have a table like this. 我有一张这样的桌子。
___|____
Id | name
1 | a
2 | b
3 | c
4 | A
5 | B
6 | C
What will be the query to get the result like this in sql 在sql中获取这样的结果的查询将是什么
___|____
Id | name
4 | A
1 | a
5 | B
2 | b
6 | C
3 | c
Editted 已编辑
This seams to be the most easy way changed DDS idea into a more general working one for all MySQL versions.. 这似乎是将DDS想法转变为适用于所有MySQL版本的更通用的最简单方法。
Query 询问
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
Result 结果
| 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 解释视图,以便您可以看到DB Fiddle发生的情况
Or the more stabile one because of the unique generated values for the calculated_ascii_value column. 或更稳定的一种,因为为calculated_ascii_value列生成的唯一值。 Explaining View so you can see what happens on DB Fiddle
解释视图,以便您可以看到DB Fiddle发生的情况
The other query is pretty complex.. 另一个查询非常复杂。
Query 询问
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
;
Results 结果
| id | name |
| --- | ---- |
| 4 | A |
| 1 | a |
| 5 | B |
| 2 | b |
| 6 | C |
| 3 | c |
Note there are some things you should know 请注意,您应该了解一些事情
COLLATE utf8mb4_bin
might be changed to COLLATE utf8_bin
instead when your MySQL uses utf8 charset. 当您的MySQL使用utf8字符集时,
COLLATE utf8mb4_bin
可能会改为COLLATE utf8_bin
。
And SELECT @orderList := 'A,a,B,b,C,c' /* add all to Z,z */
you need to might add more to Z,z
SELECT @orderList := 'A,a,B,b,C,c' /* add all to Z,z */
您可能需要添加更多内容到Z,z
this will make a new column 'newid' with the order you need 这将使新列“ 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
Try like this. 尝试这样。 I Just used database from w3schools, need to check if works in MySql.
我刚从w3schools使用数据库,需要检查MySql是否工作。
SELECT * FROM myTable GROUP BY name ORDER BY UPPER(name), LOWER(name);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.