MySQL 将字符串转换为数字类型并进行排序

MySQL 将字符串转换为数字类型并进行排序起因:需要对接第三方统计系统,并且第三方系统给的数据那真的是一团乱,害,都是泪呀,头发又感觉凉飕飕的;数据有毒,所有的小数都是用varchar(20)保存的,现在有要对数据进行排序并展示。示例数据:area_gdp表idareagdp1北京12002上海61003广州60004深圳980select*fromarea_gdpORDERBYgdpASC#查询结果如下1 北京 12003 广州 60002 上海

大家好,又见面了,我是你们的朋友全栈君。

需要对接第三方统计系统,并且第三方系统给的数据那真的是一团乱,害,都是泪呀,头发又感觉凉飕飕的;数据有毒,所有的
小数都是用
varchar(20) 保存的,现在有要对该数据进行排序并展示。

示例数据:area_gdp 表

id area gdp
1 北京 1200
2 上海 6100
3 广州 6000
4 深圳 980
select * from area_gdp ORDER BY gdp ASC

# 查询结果如下
1	北京		1200
3	广州 	6000
2	上海		6100
4	深圳 	980

SELECT * FROM area_gdp ORDER BY gdp DESC
# 查询结果如下
4	深圳		980
2	上海		6100
3	广州		6000
1	北京		1200

结果与预想的不一样,其实 MySQL 没有想象中的那么智能,对于 char 或者是 varchar 类型的数据,只会当做字符串进行对待,所以会依次的对字符串中的每一个字符进行排序。

如果明确知道 char 或者是 varchar 里面保存的是数字类型,可以在排序的时候将字段转换成数字,并实现想要的排序功能;这里提供三种方法,如果有其他更好的可以互相交流一下。

示例数据:area_gdp 表

id area gdp
1 北京 1200
2 上海 6100
3 广州 6000
4 深圳 980

1. 方法一: 字段值 + 0

MySql 会根据上下文自动转换类型,这里会将被本来是字符类型的字段值以数值型返回,如果字段存放的值为数值字符,则会转换为数值型返回,如果字段存放的值为字母或者汉字,则直接返回 0

# 示例

SELECT 'abd'+0  # 结果为 0 
SELECT 'abd5'+0  # 结果为 0 
SELECT '5abd'+0  # 结果为 5
SELECT '5abd5'+0 # 结果为 5
SELECT '55'+0 # 结果为 55
# 解决上面的问题

select * from area_gdp ORDER BY gdp+0 ASC

# 查询结果如下
4	深圳		980
1	北京		1200
3	广州		6000
2	上海		6100

select * from area_gdp ORDER BY gdp+0 DESC
# 查询结果如下
2	上海		6100
3	广州		6000
1	北京		1200
4	深圳		980

2. 方法二: 通过 case() 函数

CAST() 函数,把一个字段的值转成另一个类型并输出。
用法: CAST ( 字段名 AS 转换的类型 )

select * from area_gdp ORDER BY CAST(gdp AS SIGNED) ASC

# 查询结果如下
4	深圳		980
1	北京		1200
3	广州		6000
2	上海		6100

select * from area_gdp ORDER BY CAST(gdp AS SIGNED) DESC
# 查询结果如下
2	上海		6100
3	广州		6000
1	北京		1200
4	深圳		980
  • unsigned 表示无符号,不能表示小数
  • signed 表示有符号,可以表示小数

3. 方法三: 通过 CONVERT() 函数

CONVERT() 函数,把一个字段的值转成另一个类型并输出。
用法: CONVERT ( 字段名 , 转换的类型 )

select * from area_gdp ORDER BY CONVERT(gdp,SIGNED) ASC

# 查询结果如下
4	深圳		980
1	北京		1200
3	广州		6000
2	上海		6100

select * from area_gdp ORDER BY CONVERT(gdp,SIGNED) DESC
# 查询结果如下
2	上海		6100
3	广州		6000
1	北京		1200
4	深圳		980
  • unsigned 表示无符号,不能表示小数
  • signed 表示有符号,可以表示小数

博客地址:Roc’s Blog

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145085.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • TM影像波段介绍「建议收藏」

    TM影像波段介绍「建议收藏」一、各波段特征:1.TM10.45-0.52um,蓝波段,对水体穿透强,对叶绿素与叶色素反映敏感,有助于判别水深及水中叶绿素分布以及水中是否有水华等.2.TM20.52-0.60um,绿波段,对健康茂盛植物的反射敏感,对力的穿透力强,用于探测健康植物绿色反射率,按绿峰反射评价植物的生活状况,区分林型,树种和反映水下特征.3.TM30.62-0.69UM,红波段,叶绿

  • golang2021.7.20激活码_在线激活

    (golang2021.7.20激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.htmlMLZPB5EL5Q-eyJsa…

  • 交叉编译lrzsz

    交叉编译lrzsz参考:https://blog.csdn.net/linucos/article/details/5582979https://blog.csdn.net/wangzhen209/article/details/32713715https://blog.csdn.net/zijie_xiao/article/details/50934279步骤:获取源码:https://www…

  • idea 2022 激活码永久 mac【2022.01最新】2022.02.27

    (idea 2022 激活码永久 mac)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.cn/100143.html2K…

  • cut it out什么意思_cutout例句

    cut it out什么意思_cutout例句1.几种数据增强的比较Mixup:将随机的两张样本按比例混合,分类的结果按比例分配;Cutout:随机的将样本中的部分区域cut掉,并且填充0像素值,分类的结果不变;CutMix:就是将一部分区域cut掉但不填充0像素而是随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配区别上述三种数据增强的区别:cutout和cutmix就是填充区域像素值的区别;mixup和cutmix是混合两种…

  • Linux命令之解压缩:tar、zip、rar 命令

    Linux命令之解压缩:tar、zip、rar 命令一、简介解压缩是一个常用的操作,在Linux中通常比较常用的是tar命令,zip和rar命令则是Windows中比较常用。二、快速使用1.tar命令语法:tar[主选项+辅选项]文件或目录示例:#压缩文件file1和目录dir2到test.tar.gztar-zcvftest.tar.gzfile1dir2#…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号