因为我的表里面有英文字母开头的
这样就可以排除
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
得到:
但是
我想求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;
就会报错
我不是已经排除了字母吗?
你看一下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()函数将子字符串转换为无符号整数,从而避免了比较时的错误。现在就可以正常执行查询并得到结果了。
【相关推荐】