简体   繁体   English

如何在mysql中通过小写字母获取首字母等数据?

[英]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    |

View on DB Fiddle 在数据库小提琴上查看

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    |

View on DB Fiddle 在数据库小提琴上查看

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM