[英]How to get data like first capital by lower cases in mysql?
mysql的新手,
我有一張這樣的桌子。
___|____
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
已編輯
這似乎是將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 |
或更穩定的一種,因為為calculated_ascii_value列生成的唯一值。 解釋視圖,以便您可以看到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
這將使新列“ 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.