为什么sql排除了字母以后再比数字大小还是报错?

因为我的表里面有英文字母开头的
这样就可以排除

select distinct substr(a.医保目录编码,0,4) from(
select y.* from yb_fymxxx_lyzyy y
where y.医保目录编码 in (SELECT t.医保目录编码 from yb_fymxxx_lyzyy t WHERE substr(t.医保目录编码,0,4) LIKE  '33%'  and substr(t.医保目录编码,0,4) not like '33A%' )) a

得到:

img

但是
我想求3302-3316内的

select distinct substr(a.医保目录编码,0,4) from(
select y.* from yb_fymxxx_lyzyy y
where y.医保目录编码 in (SELECT t.医保目录编码 from yb_fymxxx_lyzyy t WHERE substr(t.医保目录编码,0,4) LIKE  '33%'  and substr(t.医保目录编码,0,4) not like '33A%' )) a
where substr(a.医保目录编码,0,4) >= 3302 and substr(a.医保目录编码,0,4) <= 3316;

就会报错

img

我不是已经排除了字母吗?

你看一下substr(a.医保目录编码,0,4)得到的结果是不是全是数字,有没有字母或者是空格的

【以下回答由 GPT 生成】

问题的原因在于在执行第二个代码块时,虽然已经使用了substr()函数把字母字符排除掉,但是在使用>=和<=进行数字大小比较时,仍然会出错,因为在执行比较时,数据库会尝试把子字符串转换为数字,而由于子字符串中可能包含非数字的字符,所以会报错。

解决这个问题的方法是在进行比较之前,先把子字符串转换为数字。下面是修改后的代码:

SELECT DISTINCT a.医保目录编码
FROM (
  SELECT y.*
  FROM yb_fymxxx_lyzyy y
  WHERE y.医保目录编码 IN (
    SELECT t.医保目录编码
    FROM yb_fymxxx_lyzyy t
    WHERE substr(t.医保目录编码, 0, 4) LIKE '33%' AND substr(t.医保目录编码, 0, 4) NOT LIKE '33A%'
  )
) a
WHERE CAST(substr(a.医保目录编码, 0, 4) AS UNSIGNED) >= 3302
  AND CAST(substr(a.医保目录编码, 0, 4) AS UNSIGNED) <= 3316;

在修改后的代码中,使用了CAST()函数将子字符串转换为无符号整数,从而避免了比较时的错误。现在就可以正常执行查询并得到结果了。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^