Oracle函数Substrb和Convert函数问题

Oracle函数Substrb和Convert函数问题,第1张

substr是按字符来计算,一个字母或汉字都按一个字符计算如:

substr('智能ABC',2,2)='能A'

如果想要按字节来计算则可以采用substrb函数,用法一样

substrb('智能ABC',3,4)='能AB'

当然还有另外几个按不同编码计算的函数

substrc:按Unicode编码,

substr2:按UCS2编码,

substr4:按UCS4编码。

不一样 比如这两个 select substr('你好吗',1,1) from dualselect substrb('你好吗',1,1) from dual第一个有结果,是“你”,第二个就无结果 因为第一个是按字符位来取,从第一位取一位长度 第二个是按字节来取,对于汉字来说,一个汉字是2个字

没有你就自己写一个咯,

/**************

create by Kevin.Chen 20161210

Double-byte characters are dropped ,if they are truncated

**************/

create function dbo.substrb(@demo nvarchar(100),@sub int,@len int)

returns nvarchar(100)

as

begin

declare @datalen int,@cut nvarchar(100),@returns nvarchar(100)

set @returns=''

set @cut=@demo

set @sub=@sub

while @sub>0

  begin

    --set @datalen=case when unicode(left(@cut,1)) between 97 and 122 then 1 when unicode(left(@cut,1)) between 65 and 90 then 1 else 2 end

    set @datalen=case when unicode(left(@cut,1))<127 then 1 else 2 end

    set @cut=right(@cut,len(@cut)-1)

    set @sub=@sub-@datalen

  end

while @len>0

  begin

    --set @datalen=case when unicode(left(@cut,1)) between 97 and 122 then 1 when unicode(left(@cut,1)) between 65 and 90 then 1 else 2 end

    set @datalen=case when unicode(left(@cut,1))<127 then 1 else 2 end

    set @len=@len-@datalen

    if @len>=0

      begin

        set @returns=@returns+left(@cut,1)

        set @cut=right(@cut,len(@cut)-1)

      end

  end

return (@returns)

end

go

declare @demo1 nvarchar(500),@demo2 nvarchar(500)

set @demo1=N'。,【】微软SqlServer数据库2014'

set @demo2=N'!@#$微软SqlServer数据库2014'

select dbo.substrb(@demo1,0,6)

select dbo.substrb(@demo2,0,6)

go

drop function dbo.substrb


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9948656.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存