專案中一些sql的運用
最近做專案中用到了幾個不常用的sql,現總結如下:
1.CHARINDEX ( expression1 , expression2 [ , start_location ] )(注:該方法只用於SqlServer)
CHARINDEX函式返回字元或者字串在另一個字串中的起始位置,如果沒有找到字串,則返回0.
Expression1是要到expression2中尋找的字元中,start_location是CHARINDEX函式開始在expression2中找expression1的位置。
實際運用中,可以用來實現按照指定字串順序排序顯示:
select name from tab order by CHARINDEX(name,'張三,李四,王五') asc;
顯示結果:name
張三
李四
王五
2.case when then
sql語句判斷方法之一Case具有兩種格式。簡單Case函式和Case搜尋函式。
--簡單Case函式
CASE sex
WHEN '1' THEN '男'
WHEN '2' THEN '女'
ELSE '其他' END
--Case搜尋函式
CASE WHEN sex = '1' THEN '男'
WHEN sex = '2' THEN '女'
ELSE '其他' END
這兩種方式,可以實現相同的功能。簡單Case函式的寫法相對比較簡潔,但是和Case搜尋函式相比,功能方面會有些限制,比如寫判斷式。
還有一個需要注意的問題,Case函式只返回第一個符合條件的值,剩下的Case部分將會被自動忽略。
例子:
有一張表,裡面有3個欄位:語文,數學,英語。其中有3條記錄分別表示語文70分,數學80分,英語58分,請用一條sql語句查詢出這三條記錄並按以下條件顯示出來(並寫出您的思路):
大於或等於80表示優秀,大於或等於60表示及格,小於60分表示不及格。
顯示格式:
語文 數學 英語
及格 優秀 不及格
------------------------------------------
select
(case when 語文>=80 then '優秀'
when 語文>=60 then '及格'
else '不及格') as 語文,
(case when 數學>=80 then '優秀'
when 數學>=60 then '及格'
else '不及格') as 數學,
(case when 英語>=80 then '優秀'
when 英語>=60 then '及格'
else '不及格') as 英語,
from table
CASE 可能是 SQL 中被誤用最多的關鍵字之一。雖然你可能以前用過這個關鍵字來建立欄位,但是它還具有更多用法。例如,你可以在 WHERE 子句中使用 CASE。
首先讓我們看一下 CASE 的語法。在一般的 SELECT 中,其語法如下:
SELECT =
CASE
WHEN THEN
WHEN THEN
ELSE
END
在上面的程式碼中需要用具體的引數代替尖括號中的內容。下面是一個簡單的例子:
USE pubs
GO
SELECT
Title,
'Price Range' =
CASE
WHEN price IS NULL THEN 'Unpriced'
WHEN price < 10 THEN 'Bargain'
WHEN price BETWEEN 10 and 20 THEN 'Average'
ELSE 'Gift to impress relatives'
END
FROM titles
ORDER BY price
GO
這是 CASE 的典型用法,但是使用 CASE 其實可以做更多的事情。將指定記錄預設排到最前面: select name from tab order by case when name='張三' then 0 else 1 end,name asc;
3.for xml path('')
那麼還是首先來介紹一下FOR XML PATH ,假設現在有一張興趣愛好表(hobby)用來存放興趣愛好,表結構如下:
接下來我們來看應用FOR XML PATH的查詢結果語句如下:
SELECT*FROM@hobbyFOR XML PATH結果:
<row><hobbyID>1</hobbyID><hName>爬山</hName></row><row><hobbyID由此可見FOR XML PATH 可以將查詢結果根據行輸出成XML各式!
那麼,如何改變XML行節點的名稱呢?程式碼如下:
SELECT*FROM@hobbyFOR XML PATH('MyHobby')結果一定也可想而知了吧?沒錯原來的行節點<row> 變成了我們在PATH後面括號()中,自定義的名稱<MyHobby>,結果如下:
<MyHobby><hobbyID>1</hobbyID><hName>爬山</hName></MyHobby><MyHobby><hobbyID>2</hobbyID><hName>游泳</hName></MyHobby><MyHobby><hobbyID>3</hobbyID><hName>美食</hName></MyHobby>這個時候細心的朋友一定又會問那麼列節點如何改變呢?還記的給列起別名的關鍵字AS嗎?對了就是用它!程式碼如下:
SELECT hobbyID as'MyCode',hName as'MyName'FROM@hobbyFOR XML PATH('MyHobby') 那麼這個時候我們列的節點名稱也會程式設計我們自定義的名稱 <MyCode>與<MyName>結果如下: <MyHobby><MyCode>1</MyCode><MyName>爬山</MyName></MyHobby><MyHobby><MyCode>2</MyCode><MyName>游泳</MyName></MyHobby><MyHobby><MyCode>3</MyCode><MyName>美食</MyName></MyHobby> 噢! 既然行的節點與列的節點我們都可以自定義,我們是否可以構建我們喜歡的輸出方式呢?還是看程式碼: SELECT'[ '+hName+' ]'FROM@hobbyFOR XML PATH('')沒錯我們還可以通過符號+號,來對字串型別欄位的輸出格式進行定義。結果如下:
[ 爬山 ][ 游泳 ][ 美食 ] 一般我們都喜歡以,隔開,程式碼如下SELECT stuff(','+hName,1,1,'')FROM@hobbyFOR XML PATH('')
結果如下:
爬山,游泳,美食 在將sql應用到Java程式碼進行展示時,得出的結果不是字串,而是一個物件,所以要用cast(xx as nvarchar)將其轉為字串,如下:SELECT cast(stuff(','+hName,1,1,'')
as nvarchar)FROM@hobbyFOR XML PATH('')