sqlserver 的类似oracle的decode函数
发布时间:2020-12-12 14:15:19 所属栏目:MsSql教程 来源:网络整理
导读:???? 原来系统是在oracle上开发的,后来客户一声令下,就转移到sqlserver了。在写存储过程的时候,发现decode方法没有,可以用case when来替代。但是之前项目会议上领导又提出,客户说有可能改为其他数据库(或者oracle或者mysql)。所以就想着写一个oracle
???? 原来系统是在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,table_col1),就会显得很多),这次在做这个sqlserver的decode函数的时候,一定要灵活一点。 直接贴代码,使用方法就按照测试用例来调用就行: --sqlserver类似oracle的decode函数 --测试用例一:select dbo.fn_decode('2','NULL,空,1,一,二,没找到') --测试用例二:select dbo.fn_decode('23',二') --测试用例三:select dbo.fn_decode('23',没找到') --测试用例四:select dbo.fn_decode('null','null,0') --测试用例五:select dbo.fn_decode(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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- sql-server – 从SQL Server 2008 Express升级到2008 Devel
- sql-server – 复合主键和其他索引
- sql-server-2005 – 索引性能BigInt与VarChar
- MySQL开启慢查询日志log-slow-queries的方法
- SQL Server 求字符串中汉字的个数的sql语句
- sql-server – 为什么SELECT查询会导致写入?
- 解决session阻塞的问题
- SQL Server Management Studio(SSMS)复制数据库的方法
- 在SQLServer/MySQL数据库中如何取得刚插入的标识值
- 是否可以将MDF文件附加到Azure SQL数据库?