有一張新聞資料表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個Null 字元,例如: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