一个超级烦人的运算问题
我的数据库表中的某字段的内容是3*4,字段类型是varchar,我想查出来的结果是12,而不是3*4,我想让其先运算,如何写这个sql语句? 问题点数:10、回复次数:19Top
1 楼bcwchina(修哲)回复于 2006-12-01 12:00:27 得分 0
怎么没有人顶一下 啊Top
2 楼bcwchina(修哲)回复于 2006-12-01 12:05:23 得分 0
这里有没有高手啊,怎么连这个问题都解决不了啊.郁闷的要死Top
3 楼hhhdyj(萤火虫)回复于 2006-12-01 12:16:03 得分 0
/*--计算表达式的函数
计算给定算术表达式的值
此方法由VB版 hhjjhjhj(大头)
提供的VB处理程序程序上改造而来
--邹建 2004.07(引用请注明此信息)--*/
/*--调用示例
select dbo.f_calc('123+456')
--*/
create function f_calc(
@str varchar(1000)--要计算的表达式
)returns sql_variant
as
begin
declare @re sql_variant
declare @err int,@src varchar(255),@desc varchar(255)
declare @obj int
exec @err=sp_oacreate 'MSScriptControl.ScriptControl',@obj out
if @err<>0 goto lb_err
exec @err=sp_oasetproperty @obj,'Language','vbscript'
if @err<>0 goto lb_err
exec @err=sp_oamethod @obj,'Eval',@re out,@str
if @err=0 return(@re)
lb_err:
exec sp_oageterrorinfo NULL, @src out, @desc out
declare @errb varbinary(4),@s varchar(20)
set @errb=cast(@err as varbinary(4))
exec master..xp_varbintohexstr @errb,@s out
return('错误号: '+@s+char(13)+'错误源: '+@src+char(13)+'错误描述: '+@desc)
end
go
Top
4 楼hhhdyj(萤火虫)回复于 2006-12-01 12:16:29 得分 0
转的别的帖。Top
5 楼bcwchina(修哲)回复于 2006-12-01 12:19:39 得分 0
有没有简单一点的啊,太多了吧,Top
6 楼asuan(~不要叫我高手~)回复于 2006-12-01 12:29:19 得分 0
如果你的字段内容都是这个格式的就没问题:
select convert(int,left(b,CHARINDEX('*',b)-1))*convert(int,right(b,len(b)- CHARINDEX('*',b)) )
from ( select '3*4' as b) as aTop
7 楼bcwchina(修哲)回复于 2006-12-01 12:39:03 得分 0
不对啊,我复制过去说
服务器: 消息 111,级别 15,状态 1,行 3
'CREATE FUNCTION' 必须是批查询中的第一条语句。
服务器: 消息 137,级别 15,状态 1,行 20
必须声明变量 '@str'。
服务器: 消息 178,级别 15,状态 1,行 22
在此上下文中不能使用带有返回值的 RETURN 语句。
服务器: 消息 178,级别 15,状态 1,行 28
在此上下文中不能使用带有返回值的 RETURN 语句。
Top
8 楼bcwchina(修哲)回复于 2006-12-01 12:40:06 得分 0
我的字段格式有的是数字,有的是数字*数字,该如何写Top
9 楼xiaoku(野蛮人(^v^))回复于 2006-12-01 12:49:57 得分 0
我的可以:
select dbo.f_calc('123-456')
-----------------------------------
123456
(所影响的行数为 1 行)
select dbo.f_calc('123-456')
-----------------------------------
-333
(所影响的行数为 1 行)Top
10 楼reizedelphi()回复于 2006-12-01 12:51:12 得分 0
哎呀 写一个表达式解析器就可以了Top
11 楼xiaoku(野蛮人(^v^))回复于 2006-12-01 12:53:32 得分 0
ls的如何写阿?Top
12 楼asuan(~不要叫我高手~)回复于 2006-12-01 13:19:19 得分 10
select convert(int,left(字段名,CHARINDEX('*',字段名)-1))*convert(int,right(字段名,len(字段名)- HARINDEX('*',字段名)) )
from 表名Top
13 楼bcwchina(修哲)回复于 2006-12-01 13:20:43 得分 0
to:reizedelphi()
表达式解析器如何写啊Top
14 楼asuan(~不要叫我高手~)回复于 2006-12-01 13:22:00 得分 0
select case CHARINDEX('*',字段名) when 0 then 字段名 else convert(int,left(字段名,CHARINDEX('*',字段名)-1))*convert(int,right(字段名,len(字段名)- HARINDEX('*',字段名)) ) end
from 表名
Top
15 楼asuan(~不要叫我高手~)回复于 2006-12-01 13:22:38 得分 0
数字的就直接取出来,不是数据的就先运算Top
16 楼marco08(天道酬勤)回复于 2006-12-01 13:47:06 得分 0
create table T(col varchar(10))
insert T select '3*4'
union all select '4*6'
declare @sql varchar(4000)
set @sql=''
select @sql=@sql+'select '+col+' union all ' from T
select @sql=left(@sql, len(@sql)-10)
exec(@sql)
--result
-----------
12
24Top
17 楼marco08(天道酬勤)回复于 2006-12-01 13:47:28 得分 0
用動態SQL試試Top
18 楼bcwchina(修哲)回复于 2006-12-01 15:37:42 得分 0
To:asuan(~不要叫我高手~)
服务器: 消息 195,级别 15,状态 10,行 1
'HARINDEX' 不是可以识别的 函数名。
Top
19 楼bcwchina(修哲)回复于 2006-12-01 15:43:24 得分 0
o ,好了,谢谢asuan(~不要叫我高手~)
马上揭贴Top





