函数subString的使用陷阱 Oracle&SQLServer
- $sourceString 资源字符串。
- $startingLoc 子字符串在资源字符串中的起点。如果此值为负数或 0,则只返回那些所在位置大于零的字符。如果此值大于 $sourceString 的长度,则返回长度为零的字符串。
- $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