SQL SERVER 字符串操作注意点

  有一张新闻数据表tb_news,该表有字段news_id int, news_type int,前者是主键,后者是新闻所属栏目ID,现在要求是这样:

给定一个字符串a_right,该字符串中包含多个新闻栏目ID值,即news_type,并且存储格式是'b'+news_type+'v',各ID值之间以逗号相隔,

例如:b1v, b2v, b3v……

  现在要从新闻表中查询出所有news_type经格式转换为'b'+news_type+'v'后,该格式的新闻栏目被包含在a_right中的新闻,刚

开始写的查询语句如下:

  select * from tb_news where charindex('b'+str(news_type)+'v', @a_right) >= 1

  结果执行结果与愿望中的结果大相径庭!

  经过反复排查,最后终于查出原因所在:SQL SERVER的str()函数有两个参数:str(express, length),当未指定length时,默认

是转为字符串后,字符串左边保留10个空字符,例如:print 'b'+str(2),则结果为b          2。因此,需要将转化后的字符串去掉空值,

此时可以使用ltrim()函数,例如执行:print 'b'+ltrim(str(2)),结果为b2。

  于是将上面的查询语句改为:

  select * from tb_news where charindex('b'+ltrim(str(news_type))+'v', @a_right) >= 1

  顺利执行!

 

  附:

  一 str函数详解

  在SQL SERVER Manage Studio中执行:

  print 'b'+str(333, 1) 结果为:b3;

  print 'b'+str(333, 2) 结果为:b33;

  print 'b'+str(333, 4) 结果为:b*;

  print 'b'+str(333)    结果为:b          333

  二 SQL SERVER中针对字符串操作的函数有如下几个常用:

  1.1 长度与分析用  

  datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格 

  substring(expression,start,length) 不多说了,取子串 

  right(char_expr,int_expr) 返回字符串右边int_expr个字符  

  1.2 字符操作类  

  upper(char_expr) 转为大写 

  lower(char_expr) 转为小写

  space(int_expr) 生成int_expr个空格

  replicate(char_expr,int_expr)复制字符串int_expr次

  reverse(char_expr) 反转字符串

  stuff(char_expr1,start,length,char_expr2) 将字符串char_expr1中的从start开始的length个字符用char_expr2代替 

  ltrim(char_expr) 去掉左边的空格;rtrim(char_expr) 去掉右边的空格

  ascii(char) char(ascii) 两函数对应,取ascii码,根据ascii吗取字符  

  1.3 字符串查找

  charindex(char_expr,expression) 返回char_expr的起始位置;索引从数字1开始,而非0

  patindex("%pattern%",expression) 返回指定模式的起始位置,否则为0  

posted @ 2010-04-02 17:07  弹着钢琴设计  阅读(636)  评论(0编辑  收藏  举报