SQL数字与字符串比较

数据库里存的是字符串,表示数字,在接口查询的时候需要进行数字大小的比较,下面记录几种常见的方式

数字和字符串比较

MySQL字符串和数字比较时会把字符串类型转成整数类型,从首字母开始,遇到非数字类型后终止。

而对于数字开头的字符串来说,转为数字的结果就是截取前面的数字部分,而对于开头部分不能截取出数字的字符串来说,转换的结果自然就是0了。

select cast('123abc' as signed); # 123
select cast('123.45abc' as decimal(5,2)); # 123.45
select cast('abc' as signed); # 0

原文:https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html
Comparison operations result in a value of 1 (TRUE), 0 (FALSE), or NULL. These operations work for both numbers and strings. Strings are automatically converted to numbers and numbers to strings as necessary.

对于数据开头的字符串,转成数字后会自动丢弃后面的字母部分,只留下纯数字进行比较
对于没有数字的那些字符串,与数值进行比较的时候,就只剩下0去和其他数值进行比较了

# 对于开头部分不能截取出数字的字符串来说,转换的结果自然就是0了。就只剩下0去和其他数值进行比较了。
select 'abc' = 0; # 1
SELECT "a2bc" < 2; # 1

# 对于数据开头的字符串,转成数字后会自动丢弃后面的字母部分,只留下纯数字进行比较
select 11 > '010abc'; # 1, 11和010进行比较
select '01abc' > 0;	# 1, 01和0进行比较

注意

  1. 尽量避免字符串与数字的直接比较,由于类型不匹配的原因,将会导致表索引无法用上。

to_number

如果数据库里面是以字符串存储数字的,这个时候要进行数字形式的比较,Oracle中可以用to_number()函数,它可以将char或varchar2类型的字符串转换为一个number类型的数值,需要注意的是,被转换的字符串必须符合数值类型格式,如果被转换的字符串不符合数值型格式,Oracle将抛出错误提示;

MySQL的话可以使用CAST()CONVERT()函数,具体用法就不赘述了

代码比较

如果是整数,使用BigInteger,小数则使用BigDecimal

public static int compareNumbers(String num1, String num2) {
    // 将字符串转换为 BigDecimal
    BigDecimal bd1 = new BigDecimal(num1);
    BigDecimal bd2 = new BigDecimal(num2);

    // 比较两个 BigDecimal 对象
    return bd1.compareTo(bd2);
}

compareTo方法返回值有 3 种:

  • 0 如果两个数字相等
  • -1 如果第一个数字小于第二个数字
  • 1 如果第一个数字大于第二个数字

如果不使用 BigInteger 和 BigDecimal 的话,则需要按位进行比较,有小数的话需要小数部分和整数部分分开进行比较

字符串与字符串比较

MySQL和Oracle字符串之间比较大小是逐位从高位到低位按ascii码逐个比较,所以字符串类型的数字18<2

SELECT '18' < '2' # 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值