在SQL语句中怎样对varchar类型的列进行数值大小的比较?
有一个varchar列,里面的内容有字符例如fgg,aa,bb等等,有数字,现在想进行数值大小的比较例如
select * from table1 where field1>20
可是因为列里面有字符数据,此语句不能执行:
服务器: 消息 245,级别 16,状态 1,行 1
将 varchar 值 'fgg' 转换为数据类型为 int 的列时发生语法错误。
我试过转换也不行,请教大家如何在不改变列的数据类型的情况下忽略字符数据,把那些数值数据用比较表达式查找出来?
问题点数:0、回复次数:10Top
1 楼lufree(荆州城公子三求计,博望坡军师初用兵)回复于 2004-12-04 00:31:01 得分 0
???Top
2 楼lienzhu(李强)回复于 2004-12-04 00:54:40 得分 0
sql="select * from table1 where field1 between '20' and '9'"
这样会得到首字母为2 到 9 之间的所有数据,可能不全正确,但可以减少范围Top
3 楼yesyesyes()回复于 2004-12-04 13:28:08 得分 0
如果字符串中只有一个连续的整数数字子串,则
where cast(substring
(field1,
patinedx('%[0-9]%',field1),
len(field1)-patinedx('%[0-9]%',field1)-patinedx('%[0-9]%',reverse(field1))+2)
as int)>20Top
4 楼vinsonshen(为了明天)回复于 2004-12-04 13:40:28 得分 0
若数字字符串不是连续的, 而要取出里面的全部数字,则用循环去截取啦~~~Top
5 楼zhang_yzy(六子儿)回复于 2004-12-04 16:13:45 得分 0
select *
from (select *
from table1
where upper(field1) like '%[^A..Z]%') a
where cast(field1 as int)>20
注意:field1不能有非a-z,A-Z,0-9的字符
Top
6 楼lufree(荆州城公子三求计,博望坡军师初用兵)回复于 2004-12-05 01:41:01 得分 0
upTop
7 楼didoleo(冷月无声)回复于 2004-12-05 17:28:35 得分 0
赞同
yesyesyes()
vinsonshen(猪骨褒咸鱼->味道没得顶)
如果字符串中只有一个连续的整数数字子串,则
where cast(substring
(field1,
patindex('%[0-9]%',field1),
len(field1)-patindex('%[0-9]%',field1)-patindex('%[0-9]%',reverse(field1))+2)
as int)>20
--yesyesyes() 有个小笔误 patinedx 写成patinedxTop
8 楼didoleo(冷月无声)回复于 2004-12-05 17:43:54 得分 0
--若数字字符串不是连续的, 而要取出里面的全部数字,则用循环去截取啦~~~
declare @number varchar(1000)
declare @mystring varchar(1000)
select @mystring='sdfaswa34sdfsf25143asdfsdf222asdfa'
set @number=''
while @mystring>''
begin
if(left(@mystring,1) like '%[0-9]%')
begin
print left(@mystring,1)
set @number=@number+left(@mystring,1)
end
set @mystring=stuff(@mystring,1,1,'')
end
select cast(@number as bigint)
--显示结果
3425143222
Top
9 楼didoleo(冷月无声)回复于 2004-12-05 22:08:57 得分 0
--建立个函数吧
create function f_didoleo(
@field1 varchar(8000)
)returns bigint
as
begin
declare @number varchar(1000)
set @number=''
while @field1>''
begin
if(left(@field1,1) like '%[0-9]%')
begin
set @number=@number+left(@field1,1)
end
set @field1=stuff(@field1,1,1,'')
end
return(cast(@number as bigint))
end
go
--然后调用
select * from table1 where dbo.f_didoleo(field1)>20
Top
10 楼lufree(荆州城公子三求计,博望坡军师初用兵)回复于 2004-12-10 08:42:37 得分 0
upTop




