如何在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    |

View on DB Fiddle

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    |

View on DB Fiddle

注意有些事情你应该知道

当您的 MySQL 使用 utf8 字符集时,

COLLATE utf8mb4_bin 可能会更改为 COLLATE utf8_bin

并且 SELECT @orderList := 'A,a,B,b,C,c' /* add all to Z,z */ 您可能需要添加更多到 Z,z