1. 程式人生 > >專案中一些sql的運用

專案中一些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
>2</hobbyID><hName>游泳</hName></row><row><hobbyID>3</hobbyID><hName>美食</hName></row> 複製程式碼

      由此可見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('')