IsNull 和 SQL语句中CASE WHEN用法
?【轉】IsNull 和 SQL語句中CASE WHEN用法收藏
?
【轉】IsNull 和 SQL語句中CASE WHEN用法
1、ISNULL??
? 使用指定的替換值替換?? NULL。??
???
? 語法??
? ISNULL?? (?? check_expression?? ,?? replacement_value?? )????
???
? 參數??
? check_expression??
???
? 將被檢查是否為?? NULL的表達式。check_expression?? 可以是任何類型的。??
???
? replacement_value??
???
? 在?? check_expression?? 為?? NULL時將返回的表達式。replacement_value?? 必須與?? check_expresssion?? 具有相同的類型。????
???
? 返回類型??
? 返回與?? check_expression?? 相同的類型。??
???
? 注釋??
? 如果?? check_expression?? 不為?? NULL,那么返回該表達式的值;否則返回?? replacement_value。??
???
? 示例??
? A.?? 將?? ISNULL?? 與?? AVG?? 一起使用??
? 下面的示例查找所有書的平均價格,用值?? $10.00?? 替換?? titles?? 表的?? price?? 列中的所有?? NULL?? 條目。??
???
? USE?? pubs??
? GO??
? SELECT?? AVG(ISNULL(price,?? $10.00))??
? FROM?? titles??
? GO??
???
? 下面是結果集:??
???
? --------------------------????
? 14.24??????????????????????????????????????????????
???
? (1?? row(s)?? affected)??
???
? B.?? 使用?? ISNULL??
? 下面的示例為?? titles?? 表中的所有書選擇書名、類型及價格。如果一個書名的價格是?? NULL,那么在結果集中顯示的價格為?? 0.00。??
???
? USE?? pubs??
? GO??
? SELECT?? SUBSTRING(title,?? 1,?? 15)?? AS?? Title,?? type?? AS?? Type,????
??????? ISNULL(price,?? 0.00)?? AS?? Price??
? FROM?? titles??
? GO??
???
? 下面是結果集:??
???
? Title?????????????????????? Type?????????????????? Price??????????????????????
? ---------------?? ------------?? --------------------------????
? The?? Busy?? Execut?? business?????????? 19.99??????????????????????????????????????????????
? Cooking?? with?? Co?? business?????????? 11.95??????????????????????????????????????????????
? You?? Can?? Combat???? business?????????? 2.99????????????????????????????????????????????????
? Straight?? Talk?? A?? business?????????? 19.99??????????????????????????????????????????????
? Silicon?? Valley???? mod_cook?????????? 19.99??????????????????????????????????????????????
? The?? Gourmet?? Mic?? mod_cook?????????? 2.99????????????????????????????????????????????????
? The?? Psychology???? UNDECIDED???????? 0.00????????????????????????????????????????????????
? But?? Is?? It?? User???? popular_comp?? 22.95??????????????????????????????????????????????
? Secrets?? of?? Sili?? popular_comp?? 20.00??????????????????????????????????????????????
? Net?? Etiquette?????? popular_comp?? 0.00????????????????????????????????????????????????
? Computer?? Phobic?? psychology?????? 21.59??????????????????????????????????????????????
? Is?? Anger?? the?? En?? psychology?????? 10.95??????????????????????????????????????????????
? Life?? Without?? Fe?? psychology?????? 7.00????????????????????????????????????????????????
? Prolonged?? Data???? psychology?????? 19.99??????????????????????????????????????????????
? Emotional?? Secur?? psychology?????? 7.99????????????????????????????????????????????????
? Onions,?? Leeks,???? trad_cook???????? 20.95??????????????????????????????????????????????
? Fifty?? Years?? in???? trad_cook???????? 11.95??????????????????????????????????????????????
? Sushi,?? Anyone????? trad_cook???????? 14.99??????????????????????????????????????????????
???
? (18?? row(s)?? affected)??
?
2、項目中,聯系人詳細信息這一個頁面中,聯系人的性別在數據庫字段的保存,男的用0表示,女的用1表示,所以,如果直接就讀出來綁定到DataList中,性別就顯示成0或1了。所以需要將Sql語句進行改造。先看看我原先的做法,這樣做,組長叫我重做了,要叫我要CASE WHEN來寫。
??? 不用CASE WHEN 的做法。源代碼如下:
string sql="select * from CONTACTPERSON ,CUSTOMER where CONTACTPERSONID='"+strContactid+"' and CONTACTPERSON.CUSTOMERID=CUSTOMER.CUSTOMERID";
DataSet ds=new DataSet();
ds=Common.GetDSCommon(sql);??
if(ds.Tables[0].Rows[0]["CONTACTPERSONSEX"].ToString()=="0")
?? {
??? ds.Tables[0].Rows[0]["CONTACTPERSONSEX"]="男";
?? }
?? else
?? {
??????????????? ds.Tables[0].Rows[0]["CONTACTPERSONSEX"]="女";
?? }
?使用CASE WHEN做法。
? string sql="select CUSTOMER.*,CONTACTPERSON.CONTACTPERSONNAME,CONTACTPERSON.CONTACTPERSONBIRTHDAY,CONTACTPERSON.CONTACTPERSONPOSITION,CONTACTPERSON.CONTACTPERSONDEPTNAME,";
?? sql+="CONTACTPERSON.TELEPHONE,CONTACTPERSON.MAIL,CONTACTPERSON.CITY,CONTACTPERSON.PROVINCE,CONTACTPERSON.POSTCODE,CONTACTPERSON.COUNTRY,CONTACTPERSON.MEMO,";
?? sql+="CONTACTPERSON.DIRECTOR,";
???
??? sql+="case when CONTACTPERSON.CONTACTPERSONSEX = '0'then '男' when CONTACTPERSON.CONTACTPERSONSEX= '1' then '女' end as CONTACTPERSONSEX from CUSTOMER ,CONTACTPERSON? where CONTACTPERSONID='"+strContactid+"' and CONTACTPERSON.CUSTOMERID=CUSTOMER.CUSTOMERID";
?? 可以看出這樣明顯加長了,SQL語句,這樣做有什么好處呢?
3、SQL條件控制(case when...then...else...end)
我的語句:(SQL 2000)
1:
select ByeTime,case when len(ByeTime)>0 then str(DATEDIFF(day,ComeInTime,ByeTime)) else DATEDIFF(day,ComeInTime,getdate()) end as test
from myUser where DelFlag='0' and UserID='cq'
2:
select ByeTime,case when len(ByeTime)>0 then str(DATEDIFF(day,ComeInTime,ByeTime))+'(已離職)' end as test
from myUser where DelFlag='0' and UserID='cq'
3:
select ByeTime,case when len(ByeTime)>0 then str(DATEDIFF(day,ComeInTime,ByeTime))+'(已離職)'
else DATEDIFF(day,ComeInTime,getdate()) end as test
from myUser where DelFlag='0' and UserID='cq'
為什么1 和2 執行都沒有問題,3 卻報“將 varchar 值 ' 480(已離職)' 轉換為數據類型為 int 的列時發生語法錯誤。”
select ByeTime,case when len(ByeTime)>0 then str(DATEDIFF(day,ComeInTime,ByeTime))+'(已離職)'
else str(DATEDIFF(day,ComeInTime,getdate())) end as test
from myUser where DelFlag='0' and UserID='cq'
這樣試一下.語法應該沒有問題
4、WHEN THEN
WHEN THEN
ELSE
END
--------------
? select count(*) as ct , CASE
? WHEN (Pro_state= 1) THEN '待審'
? WHEN (Pro_state= 2) THEN '已審'
? WHEN (Pro_state= 3) THEN '辦理中'
? WHEN (Pro_state= 4) THEN '已申退'
? WHEN (Pro_state= 5) THEN '來信'
? WHEN (Pro_state= 6) THEN '辦理完成'??
? WHEN (Pro_state= 7) THEN '未予立案'??
?end as pro_state
from vw_proposals_query where 1=1 GROUP BY?? pro_state
?
結果:
ct?? pro-state
30?? 辦理中
7??? 來信
1?? 辦理完成
5?? 未予立案
?
解讀:
查詢總數和pro_state 當 Pro_state= 1 時以 '待審' 替代表示
?????????????????? 當 Pro_state= 2 時以 '已審' 替代表示
?????????????????? 當 Pro_state= 3 時以 '辦理中' 替代表示
?????????????????? 。。。。。。
5、CASE 可能是 SQL 中被誤用最多的關鍵字之一。雖然你可能以前用過這個關鍵字來創建字段,但是它還具有更多用法。例如,你可以在 WHERE 子句中使用 CASE。
首先讓我們看一下 CASE 的語法。在一般的 SELECT 中,其語法如下:
SELECT <myColumnSpec> =
CASE
WHEN <A> THEN <somethingA>
WHEN <B> THEN <somethingB>
ELSE <somethingE>
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 其實可以做更多的事情。比方說下面的 GROUP BY 子句中的 CASE:
SELECT 'Number of Titles', Count(*)
FROM titles
GROUP BY
??? 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
GO
你甚至還可以組合這些選項,添加一個 ORDER BY 子句,如下所示:
USE pubs
GO
SELECT
??? 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 AS Range,
??? Title
FROM titles
GROUP BY
??? 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,
??? Title
ORDER BY
??? 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,
??? Title
GO
注意,為了在 GROUP BY 塊中使用 CASE,查詢語句需要在 GROUP BY 塊中重復 SELECT 塊中的 CASE 塊。
除了選擇自定義字段之外,在很多情況下 CASE 都非常有用。再深入一步,你還可以得到你以前認為不可能得到的分組排序結果集。
?
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/cqcp03/archive/2008/12/31/3663200.aspx
轉載于:https://www.cnblogs.com/zhangliyu/archive/2009/06/25/1511287.html
總結
以上是生活随笔為你收集整理的IsNull 和 SQL语句中CASE WHEN用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 长城汽车进军澳大利亚 右舵版首车亮相
- 下一篇: 国人常用的APP有哪些?除了微信 这9款