sqlserver 的类似oracle的decode函数

     原来系统是在oracle上开发的,后来客户一声令下,就转移到sqlserver了。在写存储过程的时候,发现decode方法没有,可以用case when来替代。但是之前项目会议上领导又提出,客户说有可能改为其他数据库(或者oracle或者mysql)。所以就想着写一个oracle的decode方法。
   当然一定要实现多个参数的查找替换。网上 http://soft-app.iteye.com/blog/1360490 有总结几个方法,由于我也是在sqlserver2005,最后也看到他推荐用方法四,所以就采用了其中的方法四,脚本如下:
--拆分字符串方法4:利用sql server2005的OUTER APPLY
-- 测试:select * from dbo.fn_split('1,2,3,4,5',',')   
CREATE FUNCTION [dbo].[fn_split]   
(   
  @str VARCHAR(MAX) ,   
  @split VARCHAR(10)   
)   
RETURNS TABLE  
    AS    
RETURN  
    ( SELECT    B.id   
      FROM      ( SELECT    [value] = CONVERT(XML , '<v>' + REPLACE(@str , @split , '</v><v>')   
                            + '</v>')   
                ) A   
      OUTER APPLY ( SELECT  id = N.v.value('.' , 'varchar(100)')   
                    FROM    A.[value].nodes('/v') N ( v )   
                  ) B   
    )   GO
  有了上面的拆分字符串方法后,就可以将参数组成一个字符串,然后在函数里拆分,相当于传入了多个参数。之前觉得oracle的decode函数的最后一个参数default有点啰嗦,其实如果没有找到的话,我就当成是原来字符串返回,如果我有default值的话,就设置,非要每次都有它不可(因为sql语句里有多个类似decode(table_col1, find,replace, find,replace, table_col1),就会显得很多),这次在做这个sqlserver的decode函数的时候,一定要灵活一点。
  直接贴代码,使用方法就按照测试用例来调用就行:
--sqlserver类似oracle的decode函数
--测试用例一:select dbo.fn_decode('2','NULL,空, 1,一,2,二,没找到') 
--测试用例二:select dbo.fn_decode('23','NULL,空, 1,一,2,二') 
--测试用例三:select dbo.fn_decode('23','NULL,空, 1,一,2,二,没找到') 
--测试用例四:select dbo.fn_decode('null','null,0')
--测试用例五:select dbo.fn_decode(null,'null,0')


CREATE function [dbo].[fn_decode](
	@theSource varchar(100),
	@findReplaceStr varchar(999)
	)
returns varchar(1000)
as          
begin
	if @theSource is null
		set @theSource='null'
	
      declare @hasFind int	--是否找到,0为未找到,1为找到
      declare @theDefault varchar(100)	--未找到的默认值,默认为原字符串
      declare @theTarget	varchar(50)	--找到的目标
      declare @theTargetReplace	varchar(50)--目标被替换的值
      declare @paramCount int		--查找替换字符串的个数
      set @hasFind = 0
      set @theDefault= @theSource
      set @theTarget = ''
      set @theTargetReplace = ''
      set @paramCount = ( select count(0) from dbo.fn_split(@findReplaceStr,',') )

    if @paramCount <2 -- 查找替换的字符串应该大于2个,否则返回原字符串
  	return  @theSource
 
   declare recordCursor cursor for select * from dbo.fn_split(@findReplaceStr,',') 
   open recordCursor 
    
   while @paramCount>=2  -- and @@fetch_status <> -1  	
	 begin
		set @paramCount = @paramCount -2  -- 准备取查找字符串和被替换字符串
		fetch next from recordCursor into @theTarget 
		fetch next from recordCursor into @theTargetReplace 
		
		if @theSource = @theTarget	-- 找到了的话,则返回 
			begin 
				set @hasFind = 1
				break
			end
	  end
	
	if @paramCount = 1 --判断是否剩下最后的默认值,如果是,则返回默认值
		fetch next from recordCursor into @theDefault

   close recordCursor
   deallocate recordCursor 
   
   if @hasFind = 0 
	  return @theDefault
    return @theTargetReplace
end
GO
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值