【问题标题】:How to get data like first capital by lower cases in mysql?如何在mysql中通过小写字母获取第一个大写的数据?
【发布时间】:2019-03-17 21:15:51
【问题描述】:

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

【问题讨论】:

  • 意思是你想要一个自定义ID?因为数据看起来像是混淆了。
  • 什么 MySQL 版本?
  • 我不明白你,但我的 iD 是自动递增
  • 当运行版本查询我得到这个版本10.1.19-MariaDB
  • 第一个表 1 | a 2 | b 第二个表(输出)1 | A2 | a id 已经改变.. 这就是我的意思,并询问您的输出 id 列是否有自定义订购。

标签: mysql sql collation


【解决方案1】:

这将按照您需要的顺序创建一个新列“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

【讨论】:

  • 窗口函数 (row_number() over (..)) 是 MariaDB 10.2.0+ 语法..
  • 我怀疑 case when val between 'A' and 'Z' 在默认的 mysql 连接/表字符集/冲突不区分大小写时能否正常工作
【解决方案2】:

试试这样。我刚刚使用了 w3schools 的数据库,需要检查是否在 MySql 中有效。

SELECT * FROM myTable GROUP BY name ORDER BY UPPER(name), LOWER(name);

【讨论】:

  • 它只会返回 a,b,c
  • select *... group by letter 是无效的 SQL.. 在好的服务器上它会告诉你 ER_WRONG_FIELD_WITH_GROUP: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.Table1.Id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
  • 您必须在建议的排序后将每列一一添加到组中
【解决方案3】:

已编辑

这似乎是将 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

或者更稳定的一个,因为计算的_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 添加更多内容

【讨论】:

猜你喜欢
  • 2013-11-29
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多