精华内容
下载资源
问答
  • 原来系统是在oracle上开发的,后来客户一声令下,就转移到sqlserver了。在写存储过程的时候,发现decode方法没有,可以用case when来替代。但是之前项目会议上领导又提出,客户说有可能改为其他数据库(或者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 , '' + REPLACE(@str , @split , '')

    + '')

    ) 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 @theTargetvarchar(50)--找到的目标

    declare @theTargetReplacevarchar(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 2008的写法:select t.PROJECTNAME,t.BUILDCONTENTSCALE,CASE t.PROJECTLEVELWHEN '0' THEN '国家重点'WHEN '1' THEN '省重点'WHEN '2' THEN '市重点'WHEN '3' THEN '区/县重点'END AS PROJECTLEVEL,t....

    SQL Server 2008中的写法:

    select t.PROJECTNAME,

    t.BUILDCONTENTSCALE,

    CASE t.PROJECTLEVEL

    WHEN '0' THEN '国家重点'

    WHEN '1' THEN '省重点'

    WHEN '2' THEN '市重点'

    WHEN '3' THEN '区/县重点'

    END AS PROJECTLEVEL,

    t.TOTALINVESTMENT,

    t.PROGRESSCONTENT,

    t.BUILDCOMPANY,

    t.CONTACTWAY,

    t.DUTYDEPT,

    t.REMARK

    from t_iipms_applayprojects t

    where t.projecttype = '1'

    and t.isvoided = '0';

    Oracle 10g中的写法:

    select t.PROJECTNAME,

    t.BUILDCONTENTSCALE,

    decode(t.PROJECTLEVEL,

    '0',

    '国家重点',

    '1',

    '省重点',

    '2',

    '市重点',

    '3',

    '区/县重点') as PROJECTLEVEL,

    t.TOTALINVESTMENT,

    t.PROGRESSCONTENT,

    t.BUILDCOMPANY,

    t.CONTACTWAY,

    t.DUTYDEPT,

    t.REMARK

    from t_iipms_applayprojects t

    where t.projecttype = '1'

    and t.isvoided = '0';

    细节对比看效果很明显:SQL Server 2008中

    CASE t.PROJECTLEVEL

    WHEN '0' THEN '国家重点'

    WHEN '1' THEN '省重点'

    WHEN '2' THEN '市重点'

    WHEN '3' THEN '区/县重点'

    END AS PROJECTLEVELOracle 10g中

    decode(t.PROJECTLEVEL,

    '0',

    '国家重点',

    '1',

    '省重点',

    '2',

    '市重点',

    '3',

    '区/县重点') as PROJECTLEVEL

    展开全文
  • SQL Server Url Decode函数

    2013-10-07 14:37:00
    SQL Server Url Decode函数 CREATE FUNCTION dbo.UrlDecode(@url varchar(3072)) RETURNS varchar(3072) AS BEGIN DECLARE @count int, @c char(1), @cenc char(2), @i int, @u...
    CREATE FUNCTION dbo.UrlDecode(@url varchar(3072))
    RETURNS varchar(3072)
    AS
    BEGIN 
        DECLARE @count int, @c char(1), @cenc char(2), @i int, @urlReturn varchar(3072) 
        SET @count = Len(@url) 
        SET @i = 1 
        SET @urlReturn = '' 
        WHILE (@i <= @count) 
         BEGIN 
            SET @c = substring(@url, @i, 1) 
            IF @c LIKE '[!%]' ESCAPE '!' 
             BEGIN 
                SET @cenc = substring(@url, @i + 1, 2) 
                SET @c = CHAR(CASE WHEN SUBSTRING(@cenc, 1, 1) LIKE '[0-9]' 
                                    THEN CAST(SUBSTRING(@cenc, 1, 1) as int) 
                                    ELSE CAST(ASCII(UPPER(SUBSTRING(@cenc, 1, 1)))-55 as int) 
                                END * 16 + 
                                CASE WHEN SUBSTRING(@cenc, 2, 1) LIKE '[0-9]' 
                                    THEN CAST(SUBSTRING(@cenc, 2, 1) as int) 
                                    ELSE CAST(ASCII(UPPER(SUBSTRING(@cenc, 2, 1)))-55 as int) 
                                END) 
                SET @urlReturn = @urlReturn + @c 
                SET @i = @i + 2 
             END 
            ELSE 
             BEGIN 
                SET @urlReturn = @urlReturn + @c 
             END 
            SET @i = @i +1 
         END 
        RETURN @urlReturn
    END
    CREATE FUNCTION dbo.fnDeURL
    (
        @URL VARCHAR(8000)
    )
    RETURNS VARCHAR(8000)
    AS
    BEGIN
        DECLARE @Position INT,
            @Base CHAR(16),
            @High TINYINT,
            @Low TINYINT,
            @Pattern CHAR(21)
    
        SELECT  @Base = '0123456789abcdef',
            @Pattern = '%[%][0-9a-f][0-9a-f]%',
            @URL = REPLACE(@URL, '+', ' '),
            @Position = PATINDEX(@Pattern, @URL)
    
        WHILE @Position > 0
            SELECT  @High = CHARINDEX(SUBSTRING(@URL, @Position + 1, 1), @Base COLLATE Latin1_General_CI_AS),
                @Low = CHARINDEX(SUBSTRING(@URL, @Position + 2, 1), @Base COLLATE Latin1_General_CI_AS),
                @URL = STUFF(@URL, @Position, 3, CHAR(16 * @High + @Low - 17)),
                @Position = PATINDEX(@Pattern, @URL)
    
        RETURN  @URL
    END

     

    posted on 2013-10-07 14:37 搏击的小船 阅读( ...) 评论( ...) 编辑 收藏

    转载于:https://www.cnblogs.com/guanjie20/p/3412446.html

    展开全文
  • Sql Server 实现 UrlDecode

    千次阅读 2016-08-04 16:38:58
    最近在公司网站要做一个统计,统计一下按关键字或者来源网站关键字的数量,结果发现...于是,文盲同学发扬了共享精神,赶紧上网搜怎么用 SqlServer 进行 UrlDecode。。。。。时间过去很久(两个小时)。。。。没有相

    最近在公司网站中要做一个统计,统计一下按关键字或者来源网站关键字的数量,结果发现数据库中太多的 URL 地址中出现了汉字,并且,这些汉字还是经过了 UrlEncode 之后的内容,天啊,你玩死文盲吧,难道每统计一次,你都想让文盲把这些内容用程序做下解码吗?

    于是,文盲同学发扬了共享精神,赶紧上网搜怎么用 SqlServer 进行 UrlDecode。。。。。时间过去很久(两个小时)。。。。没有相关的结果。。。即便是有相关内容,也都是使用System.Web.HttpUtility.UrlDecode进行实现的,但问题是用这个方法实现的话,CLR还需要 System.Web.dll以及其所依赖的其他组件支持,实在是太麻烦了

    再然后,实在没有相关内容了,只好自己写一个CLR程序来进行支持了(其实到此为止都是废话,文盲实在想不明白,为什么网上搜不到相关内容)

    ----------------------------------------------------------------------------------------------------

    首先,我们需要实现不使用System.Web.HttpUtility.UrlDecode这个方法的解码方式

    于是先写一个解码函数,这个函数需要录入一个字符串,如果有编码后的内容,将编码后的内容解码,否则正常返回

    所以先做一个支持函数

            private static byte[] EnCodeToChar(Match match)
            {
                if (Regex.IsMatch(match.Value, @"%[0-9a-f]{2}", RegexOptions.IgnoreCase))
                {
                    return new byte[] { (byte)Convert.ToInt32(match.Value.Replace("%", ""), 16) };
                }
                else
                {
                    return Encoding.UTF8.GetBytes(match.Value);
                }
            }
    
    这个函数的输入参数是正则匹配结果,返回的则是对应的 byte[],为什么这么写呢,因为不管是什么编码类型,编码内容都符合 %00-%FF这个规则,即:百分号后跟随两位十六进制数字,先不管它是utf(三位)还是gb2312(两位),至少转成 byte[] 是没错的

    然后将对应字符串的byte[]集合按顺序合并成一个大byte[],然后就可以直接使用 Encoding.GetString()方法来转成字符串了,编码在这一步进行实现

    那么分解字符串并合并byte[]的支持函数也是需要的

            private static byte[] UTF8Byte(string str)
            {
                MatchCollection mc = Regex.Matches(str, @"%[0-9a-f]{2}|[\s\S]", RegexOptions.IgnoreCase);
                List<byte[]> btlist = new List<byte[]>();
                int s = 0;
                for (int i = 0; i < mc.Count; i++)
                {
                    byte[] t = EnCodeToChar(mc[i]);
                    btlist.Add(t);
                    s += t.Length;
                }
                byte[] bt = new byte[s];
                s = 0;
                for (int i = 0; i < btlist.Count; i++)
                {
                    for (int j = 0; j < btlist[i].Length; j++)
                    {
                        bt.SetValue(((byte[])btlist[i])[j], s);
                        s++;
                    }
                }
                return bt;
            }
    
    最后,为了能够符合CLR程序集要求,并在SqlServer中使用,写一个SqlFunction

        [SqlFunction]
        public static SqlString UTF8Decode(SqlChars input)
        {
            return Encoding.UTF8.GetString(UTF8Byte(new string(input.Value)));
        }
    
    然后把程序集导入到数据库,并建立自定义函数

    CREATE FUNCTION [dbo].[UTF8Decode](@expression [nvarchar](max))
    RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
    AS 
    EXTERNAL NAME [UrlDecode].[UrlDecode].[UTF8Decode]
    恩恩恩,测试了一下,非常不错,可以直接在数据库中使用了

    ----------------------------------------------------------------------------------------------------

    其实这么看来,UrlDecode和UrlEncode也没有那么神秘了,其实算法还是很简单的,那么,就来最后一步吧

    考虑到不是所有网站的编码都是一致的,上述内容只实现了UTF8编码下的解码,现在做一个支持任意编码的解码方法吧

    以下是完整代码

    using Microsoft.SqlServer.Server;
    using System;
    using System.Collections.Generic;
    using System.Data.SqlTypes;
    using System.Text;
    using System.Text.RegularExpressions;
    
    public static partial class UrlDecode
    {
        [SqlFunction]
        public static SqlString UTF8Decode(SqlChars input)
        {
            return Encoding.UTF8.GetString(UTF8Byte(new string(input.Value)));
        }
        [SqlFunction]
        public static SqlString Decode(SqlChars input, SqlString charset)
        {
            Encoding en = Encoding.UTF8;
            try
            {
                en = Encoding.GetEncoding(charset.Value);
            }
            catch (Exception ex)
            {
            }
            return en.GetString(GetCharsetBytes(new string(input.Value), en));
        }
    
        private static byte[] EnCodeToChar(Match match, Encoding en)
        {
            if (Regex.IsMatch(match.Value, @"%[0-9a-f]{2}", RegexOptions.IgnoreCase))
            {
                return new byte[] { (byte)Convert.ToInt32(match.Value.Replace("%", ""), 16) };
            }
            else
            {
                return en.GetBytes(match.Value);
            }
        }
        private static byte[] GetCharsetBytes(string str, Encoding en)
        {
            MatchCollection mc = Regex.Matches(str, @"%[0-9a-f]{2}|[\s\S]", RegexOptions.IgnoreCase);
            List<byte[]> btlist = new List<byte[]>();
            int s = 0;
            for (int i = 0; i < mc.Count; i++)
            {
                byte[] t = EnCodeToChar(mc[i], en);
                btlist.Add(t);
                s += t.Length;
            }
            byte[] bt = new byte[s];
            s = 0;
            for (int i = 0; i < btlist.Count; i++)
            {
                for (int j = 0; j < btlist[i].Length; j++)
                {
                    bt.SetValue(((byte[])btlist[i])[j], s);
                    s++;
                }
            }
            return bt;
        }
    
        private static byte[] EnCodeToChar(Match match)
        {
            if (Regex.IsMatch(match.Value, @"%[0-9a-f]{2}", RegexOptions.IgnoreCase))
            {
                return new byte[] { (byte)Convert.ToInt32(match.Value.Replace("%", ""), 16) };
            }
            else
            {
                return Encoding.UTF8.GetBytes(match.Value);
            }
        }
        private static byte[] UTF8Byte(string str)
        {
            MatchCollection mc = Regex.Matches(str, @"%[0-9a-f]{2}|[\s\S]", RegexOptions.IgnoreCase);
            List<byte[]> btlist = new List<byte[]>();
            int s = 0;
            for (int i = 0; i < mc.Count; i++)
            {
                byte[] t = EnCodeToChar(mc[i]);
                btlist.Add(t);
                s += t.Length;
            }
            byte[] bt = new byte[s];
            s = 0;
            for (int i = 0; i < btlist.Count; i++)
            {
                for (int j = 0; j < btlist[i].Length; j++)
                {
                    bt.SetValue(((byte[])btlist[i])[j], s);
                    s++;
                }
            }
            return bt;
        }
    }
    
    

    CREATE FUNCTION [dbo].[UTF8Decode](@expression [nvarchar](max))
    RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
    AS 
    EXTERNAL NAME [UrlDecode].[UrlDecode].[UTF8Decode]
    
    CREATE FUNCTION [dbo].[UrlDecode](@expression [nvarchar](max), @pattern [nvarchar](max))
    RETURNS [nvarchar](max) WITH EXECUTE AS CALLER
    AS 
    EXTERNAL NAME [UrlDecode].[UrlDecode].[Decode]

    select *,count(0) as cnt,dbo.UTF8Decode(keyword) from tableName order by cnt desc

    perfect,就这么完成了,支持任意编码的方法则使用

    select *,count(0) as cnt,dbo.UrlDecode(keyword,'gb2312') from tableName order by cnt desc
    需要注意的是,如果输入的编码名称无法解析,则自动使用utf8进行解码了


    以上,所有内容就都完成了,当然,如果在添加程序集出错了,请参考文盲的另一篇博文参考下基本就可以解决了哦


    好吧。。。写完了这个文章,才发现,原来有其他方式实现,可以不使用 CLR 方法,真的是玩死文盲了

    http://www.cnblogs.com/guanjie20/p/3412446.html

    http://blog.csdn.net/ruijc/article/details/6931189

    展开全文
  • sqlserver 2008 写法 select t.PROJECTNAME, t.BUILDCONTENTSCALE, CASE t.PROJECTLEVEL WHEN '0' THEN '国家重点' WHEN '1' THEN '省重点' WHEN '2' THEN '市重点' WHEN '3' THEN '区...
  • oraclesql现在要改为在sqlserver中运行, 如下sql该如何修改 oraclesql decode(sign(unitweight), 1, decode(sign(unitweight - 1), -1, '0', '') || to_char(unitweight), decode(trim...
  • 这个例子非常的简单,写这个例子的目的主要还是想让大家熟悉SQL 2005 CRL 函数的一个创建过程。 在网页传递变量,一般先编码,然后解码即可。在.net 实现这个功能,非常简单直接调用(微软已经处理完成了), 它的...
  • decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值) 该函数的含义如下: IF 条件=值1 THEN  RETURN(翻译值1) ELSIF 条件=值2 THEN  RETURN(翻译值2)  ...... ELSIF 条件=值n THEN  RETURN(翻译值n) ...
  • SQL SERVER CLR UrlDecode

    2014-09-19 16:55:48
    CREATE ASSEMBLY CLR_URLDECODE from 'D:\Microsoft SQL Server\MSSQL\CLR\SQLSERVER_CLR.dll' create function UF_Scalar_SayHelloByPar(@Par nvarchar(1000)) returns nvarchar(1000) as EXTERNAL NAME...
  • sqlserver 的类似oracle的decode函数

    千次阅读 2012-11-28 19:47:53
    原来系统是在oracle上开发的,后来客户一声令下,就转移到sqlserver了。在写存储过程的时候,发现decode方法没有,可以用case when来替代。但是之前项目会议上领导又提出,客户说有可能改为其他数据库(或者oracle...
  • SQL中DECODE函数用法

    千次阅读 2019-05-06 17:19:01
    DECODE函数用法: DECODE(expr_expression, search_expression, result_expression, [default_expression]) 当search 表达式与 expr 的值匹配时,...例如 当数据status值为01或02时返回0,否则返回1: DECO...
  • 正巧最近做的自己的小工具的时候,需要在SQL Server和Access实现DECODE函数的功能。查了一下资料,汇总如下: 在SQL Server环境下,使用CASE ... WHEN ... END 进行处理,例子如下:  SELECT 'Price Category' ...
  • SQL中 decode()函数简介

    万次阅读 2017-10-16 15:06:17
    SQL中 decode()函数简介  今天看别人的SQL时看这里面还有decode()函数,以前从来没接触到,上网查了一下,还挺好用的一个函数,写下来希望对朋友们有帮助哈!        decode()函数简介...
  • Oracle:select decode(a1,'0', 'easy', '1', 'normal', '2', 'hard') level from a;转成SQL Server为:select (case a1 when '...
  • case Sex When '1' Then '男' When '0' Then '女' end as Sex (注:Sex类型 bit (0,1) 转载于:https://www.cnblogs.com/higou/archive/2004/09/01/38313.html
  • SQLDecode.zip

    2020-03-23 14:26:56
    存储过程 SQL SERVER 使用c# winform编写 2020_03_23 疯汉三发布 使用了委托编写 ,版本还没有写完
  • $sql = "SELECT a FROM `table_a`"; 首先检测搜索得到的字符串的编码类型 mb_detect_encoding($row['a'], array("ASCII",'UTF-8',"GB2312","GBK",'BIG5')); 如果得到的编码类型不是"UTF-8",则无法使用json_...
  • Decode() 对应 case when函数 case CHARINDEX('/',start_point_name) when 0 then start_point_name else substring(start_point_name,1,CHARINDEX('/',start_...注意:sqlserver在用case when判断是否为null...
  • I need to pass this arraylist to the sql server stored procedure and insert the student object data into the table. How to best achieve this in Java? I am required to have a stored procedure. Java ...
  • <p>When I execute this line <strong>EXEC pl.spGetInfo 'JOHN DOE'</strong> in SQL Server Management Studio, it works just fine. <p>When I call this php file, I am getting an error message '<strong>...
  • 赋值为NULL测试如下 首先是SQL server中 对比ORACLE 可以看到结果是不相同的,需要对CASE WHEN的语法重新处理,重新改写如下:
  • sqlserver中判断

    2009-06-03 09:16:22
    要在sql中判断一个从数据库中查出的字段,如果是三位则在他前面+'0',如果是四位则不动,在oracel中可以用decode函数,在sqlserver中怎么搞?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,387
精华内容 8,154
关键字:

server中的decodesql