函数subString的使用陷阱 Oracle&SQLServer

SQLServer:
 
函数subString有三个参数,帮助文档中给出这三个参数的意义,如下:
  1. $sourceString  资源字符串。
  2. $startingLoc   子字符串在资源字符串中的起点。如果此值为负数或 0,则只返回那些所在位置大于零的字符。如果此值大于 $sourceString 的长度,则返回长度为零的字符串。
  3. $length        [可选] 要检索的字符数。如果没有指定此值,它将返回$startingLoc 中指定的位置开始直到字符串末尾的所有字符。

在试验中,本人发现第二个参数的解释中“如果此值为负数或 0,则只返回那些所在位置大于零的字符”有特殊的意义,也是一个陷阱:负数或0也将占去字符的位置。

举个例子:

declare @str nvarchar(20)

declare @subStr nvarchar(20)

set @str='123456'

set @subStr=subString(@str,1,5)

print @subStr

 

结果: @subStr值为'12345'

如果第二个参数$startingLoc给负数或0时,负数或0也将占去字符的位置,

比如:

set @subStr=subString(@str,0,5)

@subStr值为'1234'

位置0上没有字符,却占去一位的长度

 

set @subStr=subString(@str,-1,5)

@subStr值为'123'

位置-1和位置0上没有字符,却占去了两位的长度。

所以得出以下结论:使用函数subString时,第二个参数$startingLoc虽然可以给0或负数,但最好给实际的开始位置,避免造成不必要的麻烦。

SQL Server数据库操作中,我们常常会用到Substring函数,本文我们对Substring函数的使用方法进行了总结,并通过例子对它的使用方法加以说明。接下来就让我们来一起了解一下Substring函数的使用方法吧。

SUBSTRING ( expression, start, length )

参数 expression

字符串、二进制字符串、文本、图像、列或包含列的表达式。请勿使用包含聚合函数的表达式。

start

整数或可以隐式转换为int 的表达式,指定子字符串的开始位置。

length

整数或可以隐式转换为 int 的表达式,指定子字符串的长度(但是结果并补一个返回length字符长度,要看expression的长度和start的设置!!!!!!!!!!!)。

返回值

如果expression是一种支持的字符数据类型,则返回字符数据。如果 expression 是一种支持的二进制数据类型,则返回二进制数据。

如果 start = 1,则子字符串从表达式的第一个字符开始

需要补充一句的是,开始start位置的设置,确实如果设置为1,会从第一个字符开始计数,2,3,4....以此类推。

select substring(ziduan,1,6)将会选择字段的前6个字符,比如说是200908。

如果设置为0,同样的执行select substring(ziduan,0,6)结果会是20090,

如果换成-1,同样执行select substring(ziduan,-1,6),结果会是2009。

同样-2,-3,依次类推 substring('98765',-1,3) 结果:9 。

substring('98765',0,3) 结果:98

substring('98765',1,3) 结果:987 SubString($sourceString ,$startingLoc,$length)

$sourceString 资源字符串。

$startingLoc 子字符串在资源字符串中的起点。如果此值为负数或 0,则只返回那些所在位置大于零的字符。如果此值大于 $sourceString 的长度,则返回长度为零的字符串。

$length [可选] 要检索的字符数。如果没有指定此值,它将返回从 $startingLoc 中指定的位置开始直到字符串末尾的所有字符。如果此值为负数或 0,则只返回那些所在位置大于零的字符。

 

Oracle:

SQL> select substr('12345678',-4) from dual;

SUBSTR('
--------
5678

SQL> select substr('12345678',-4,1) from dual;

SU
--
5

SQL> select substr('12345678',0,1) from dual;

SU
--
1

SQL> select substr('12345678',1,1) from dual;

SU
--
1

SQL> select substr('12345678',1,9) from dual;

SUBSTR('12345678
----------------
12345678

SQL> select substr('12345678',1,0) from dual;

S
-


SQL> select substr('12345678',1,-1) from dual;

S
-


SQL> select substr('12345678',1,100) from dual;

SUBSTR('12345678
----------------
12345678

 

SQL> select substr('12345678',0,-1) from dual;

S
-

SQL> select substr('12345678',-1,-1) from dual;

S
-

SQL> select substr('12345678',1) from dual;

SUBSTR('12345678
----------------
12345678

SQL> select substr('12345678',0) from dual;

SUBSTR('12345678
----------------
12345678

posted @ 2015-01-08 14:48  princessd8251  阅读(473)  评论(0编辑  收藏  举报