资源描述
IsNull和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、SQL条件控制(case when...then...else...end)
--1)在select 中使用
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 时以'办理中' 替代表示
。。。。。。
--2)你可以在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 其实可以做更多的事情。
--3)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 都非常有用。再深入一步,你还可以得到你以前认为不可能得到的分组排序结果集。
展开阅读全文