想破头皮的问题:计算列的case..when判断

wooden954 2009-11-10 04:57:17
有一表,其中一列名为MyCol,数据类型为Varchar(100),存储的是十六进制的数据。
定义了一个函数GetContent,这个函数比较复杂,用来计算Col列中的部分数据内容,这个函数可能执行十六进制字符串转换成十进制数值的过程,并且还受到十六进制数据之间的关系影响。
我想用这个函数计算出一个计算列来,再根据计算列的取值显示一个提示信息,类似于

select ID,Name,MyCol,
tmp=dbo.GetContent(Substring(MyCol,8,2)),
case
when tmp>=128 then '每'+cast(Tmp-128 as varchar(10))
else Cast(tmp as varchar(10))
end
from MyTable

但是总是不能实现,如果使用类似于如下的SQL语句,实现倒是能够实现,可就是跟踪的时候执行的SQL代码实在是太长了,效率非常低。因为它执行了好几次定义的函数。
select ID,Name,MyCol,
case
when dbo.GetContent(Substring(MyCol,8,2))>=128 then '每'+cast(dbo.GetContent(Substring(MyCol,8,2))-128 as varchar(10))
else Cast(dbo.GetContent(Substring(MyCol,8,2)), as varchar(10))
end
from MyTable

怎么能够让函数执行次数最少还能够达到要求?
...全文
111 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wooden954 2009-11-11
  • 打赏
  • 举报
回复
谢谢各位回答!
misterliwei 2009-11-10
  • 打赏
  • 举报
回复
TMP是Mytable中生成的表达式别名,该名称是不能在其他列中的。
干脆将函数GetContent功能扩大一点,将判断功能放在里面,返回结果。
yanglinqiang 2009-11-10
  • 打赏
  • 举报
回复

;with a as
(select ID,Name,MyCol,tmp=dbo.GetContent(Substring(MyCol,8,2))from MyTable)
select ID,Name,MyCol,case when tmp>=128 then tem-128 else tem end as tem from a
--小F-- 2009-11-10
  • 打赏
  • 举报
回复
select 
ID,Name,MyCol,
case when tmp>=128 then '每'+cast(Tmp-128 as varchar(10)) else Cast(tmp as varchar(10)) end
from
(select *, tmp=dbo.GetContent(Substring(MyCol,8,2)) from MyTable )t
chuifengde 2009-11-10
  • 打赏
  • 举报
回复
select ID,Name,MyCol,  
case
when tmp>=128 then '每'+cast(Tmp-128 as varchar(10))
else Cast(tmp as varchar(10))
end
from (select *, tmp=dbo.GetContent(Substring(MyCol,8,2)) from MyTable )aa
SQL77 2009-11-10
  • 打赏
  • 举报
回复
SELECT 
ID,NAME,MYCOL,TEM,
case
when tmp>=128 then '每'+cast(Tmp-128 as varchar(10))
else Cast(tmp as varchar(10))
end AS COL
FROM
(
select ID,Name,MyCol,
tmp=dbo.GetContent(Substring(MyCol,8,2))
from MyTable
) AS T
SQL77 2009-11-10
  • 打赏
  • 举报
回复
select ID,Name,MyCol,
tmp=dbo.GetContent(Substring(MyCol,8,2)),
case
when tmp>=128 then '每'+cast(Tmp-128 as varchar(10))
else Cast(tmp as varchar(10))
end
from MyTable

你再子查询一次
lrjt1980 2009-11-10
  • 打赏
  • 举报
回复
我感觉书写不规范,sql要求书写十分的规范
wooden954 2009-11-10
  • 打赏
  • 举报
回复
第二种方法只是个简单的例子,实际上Case段应该有好多条判断语句(多达20条)。

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧