存档

文章标签 ‘str_replace’,文章数:2

在ASE12.5.x平台中没有替换字符串的函数,也就是说没有类似replace的函数。对于replace这个词,我想有编程经验的肯定一看字 面意思就知道是将某一字符串中指定的字符串替换为另外的字符串。可惜的是这么简单的功能在ase12.5.x中没有相应的函数,只有一个可怜的stuff 函数。

stuff函数仅仅能够替换某一个字符串中某一个位置处的字符串为另外的字符串,如果这个字符串中有多处需要被替换呢?抱歉,stuff歇菜了。

一个简单的类似replace的功能还得需要写个过程或者函数来实现。 写起来效率低执行起来效率更低, so pooor.

谁要是实现了用简单的一两条sql语句顶替replace的功能,麻烦告诉我一声。谢谢!

幸运的是,ASE15.0版本中引入了类似replace的函数,但是人家的名字叫str_replace,不知道为啥?replace这个词和那个关键字冲突吗? 不解ZZZZZZZ~~~

str_replace函数的语法很简单:

                     st_replace("string_expression1", "string_expression2", "string_expression3")

就是:将字符串1中所包含的所有 的字符串2都用字符串3统统替换。

一个简单的例子:

1> select str_replace('This is Andkylee!My nAme is andkylee!','A','a')
2> go
 -------------------------------------
 This is andkylee!My name is andkylee!
(1 row affected)

 

但是, 网上有人发帖说str_replace不能替换字符串中的空格为“(也就是说删除字符串中的所有空格)。不看官方文档,想当然的就写出来这样的语句:select str_replace('123 456 ',' ','')

但是很可惜,执行失败。

1> select len('123 456 '),str_replace('123 456 ',' ','') ,len(str_replace('123 456 ',' ',''))
2> go
 ----------- -------- -----------
           8 123 456            8
(1 row affected)

 

如上可以看到select str_replace('123 456 ',' ','')并没有替换其中的空格为空(亦即删除其中的所有空格),用函数str_replace执行前后的字符串是相同的。

通过查阅官方文档中关于str_replace的介绍,有下面的两点需要注意:

1. Adaptive Server 将空字符串常量自动转换为 1 个空格的字符串,以便将该字符串与 NULL 值区分开。

2. str_replace 在第三个参数中接受 NULL,将其视为尝试用 NULL 替换 string_expression2,有效地将 str_replace 转换成“字符串切除”
操作。

这两条的意思是说:在函数str_replace中""相当于" ", NULL 相当于“”(空字符)。

 ""相当于" "

示例:

1> select str_replace("cde fghi ","","_")
2> go
 ---------
 cde_fghi_
(1 row affected)
1> select str_replace("cde fghi "," ","_")
2> go
 ---------
 cde_fghi_
(1 row affected)

 

两个空格还是2个空格意思:

1> select str_replace("cde fghi ","  ","_")
2> go

 ---------
 cde fghi

(1 row affected)

NULL 相当于“”(空字符)

示例如下:

1> select str_replace("cde fghi "," ",null),len(str_replace("cde fghi "," ",null))
2> go
 --------- -----------
 cdefghi             7
(1 row affected)
1> select str_replace("cde fghi ","",null),len(str_replace("cde fghi "," ",null))
2> go
 --------- -----------
 cdefghi             7
(1 row affected)

 

总结:

在函数str_replace中NULL 相当于“”(空字符),""相当于" " 。其它都是正常的。

通过本文中的例子,可以看出Sybase ASE中存在一些不太符合常规习惯的地方。

————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:str_replace 15.0 null 空格 替换
————————————————————————————————-

在ASE12.x版本中Sybase没有提供类似replace的函数。在ASE15.x版本中添加了替换某个字符串中指定的字符为另一个字符的函数:str_replace
使用方法为:

1> select str_replace('aaaa|bbb|ccc|','|',';')
2> go

 -------------
 aaaa;bbb;ccc;

上面的例子为将字符串aaaa|bbb|ccc|中的|替换为;

但是,在ASE12.x中需要上面上面的功能,就稍微一点麻烦了。需要结合两个函数:charindex,stuff来循环替换。
两个函数的用法分别为:

 charindex - Returns an integer representing the starting position of an expression.
    charindex(expression1, expression2)
  
 stuff - Returns the string formed by deleting a specified number of characters from one string and replacing them with another string.
    stuff(char_expr1|uchar_expr1, start, length,char_expr2|uchar_expr2)

实现的算法为:

declare @my_var char(25)
select @my_var = 'abc|ert|rfrfrf|'
while charindex('|', @my_var) > 0
begin
select @my_var = stuff(@my_var, charindex('|', @my_var), 1, ';')
end
select @my_var

执行结果为:

      1> declare @my_var char(25)
      2> select @my_var = 'abc|ert|rfrfrf|'
      3> while charindex('|', @my_var) > 0
      4> begin
      5> select @my_var = stuff(@my_var, charindex('|', @my_var), 1, ';')
      6> end
      7> select @my_var
      8> go
       -------------------------
       abc;ert;rfrfrf;

————————————————————————————————-
—- 本文为andkylee个人原创,请在尊重作者劳动成果的前提下进行转载;
—- 转载务必注明原始出处 : http://www.dbainfo.net
—- 关键字:替换  字符串  replace str_replace stuff charindex
————————————————————————————————-