四,根據條件有選擇的update。
例,有如下更新條件
1. 工資5000以上的職員,工資減少10%
2. 工資在2000到4600之間的職員,工資增加15%
很容易考慮的是選擇執行兩次update語句,如下所示
--條件1
update
personnel
setsalary = salary * 0.9
where
salary >= 5000;
--條件2
update
personnel
setsalary = salary * 1.15
where
salary >= 2000
andsalary < 4600;
但是事情沒有想象得那麼簡單,假設有個人工資5000塊。首先,按照條件1,工資減少10%,變成工資4500。接下來執行第二個sql時候,因為這個人的工資是4500在2000到4600的範圍之內, 需增加15%,最後這個人的工資結果是5175,不但沒有減少,反而增加了。如果要是反過來執行,那麼工資4600的人相反會變成減少工資。暫且不管這個規章是多麼荒誕,如果想要乙個sql 語句實現這個功能的話,我們需要用到case函式。**如下:
update
personnel
setsalary =
case
when
salary >= 5000
then
salary * 0.9
when
salary >= 2000
andsalary < 4600
then
salary * 1.15
else
salary
end;
這裡要注意一點,最後一行的else salary是必需的,要是沒有這行,不符合這兩個條件的人的工資將會被寫成null,那可就大事不妙了。在case函式中else部分的預設值是null,這點是需要注意的地方。
這種方法還可以在很多地方使用,比如說變更主鍵這種累活。
一般情況下,要想把兩條資料的primary key,a和b交換,需要經過臨時儲存,拷貝,讀回資料的三個過程,要是使用case函式的話,一切都變得簡單多了。
p_key
col_1
col_2 a
1 張三
b 2李四 c
3 王五
假設有如上資料,需要把主鍵a和b相互交換。用case函式來實現的話,**如下
update
sometable
setp_key =
case
when
p_key =
'a'
then
'b'
when
p_key =
'b'
then
'a'
else
p_key
end
where
p_key in(
'a',
'b');
同樣的也可以交換兩個unique key。需要注意的是,如果有需要交換主鍵的情況發生,多半是當初對這個表的設計進行得不夠到位,建議檢查表的設計是否妥當。
五,兩個表資料是否一致的檢查。
case函式不同於decode函式。在case函式中,可以使用between,like,is null,in,exists等等。比如說使用in,exists,可以進行子查詢,從而 實現更多的功能。
下面具個例子來說明,有兩個表,tbl_a,tbl_b,兩個表中都有keycol列。現在我們對兩個表進行比較,tbl_a中的keycol列的資料如果在tbl_b的keycol列的資料中可以找到, 返回結果'matched',如果沒有找到,返回結果'unmatched'。
要實現下面這個功能,可以使用下面兩條語句
--使用in的時候
select
keycol,
case
when
keycol
in(
select
keycol
from
tbl_b )
then
'matched'
else
'unmatched'
endlabel
from
tbl_a;
--使用exists的時候
select
keycol,
case
when
exists (
select
* from
tbl_b
where
tbl_a.keycol = tbl_b.keycol )
then
'matched'
else
'unmatched'
endlabel
from
tbl_a;
使用in和exists的結果是相同的。也可以使用not in和not exists,但是這個時候要注意null的情況。
SQL中Case的妙用 二
二,用乙個sql語句完成不同條件的分組。有如下資料 國家 country 性別 人口 population 中國 1340 中國 2260 美國 1 45 美國 2 55加拿大 1 51加拿大 2 49 英國 1 40 英國 2 60按照國家和性別進行分組,得出結果如下 國家 男 女中國 34026...
sql中case的用法
由於之前沒有用到case,乙個簡單的分類統計問題竟被我group by 又union的整得很麻煩,原來case是可以應用得很靈活的。乙個應用場景如下 乙個表中儲存了使用者 姓名,年齡,性別 要求統計 35歲和 35歲的女使用者和南使用者分別是多少 一共四類 開始我是想著先把 35歲的按性別group...
SQL中Case語句用法
sql中,case具有兩種格式。即簡單case函式和case搜尋函式。下文中筆者與大家一起討論sql中case語句用法。簡單case函式 case when 1 then 男 when 2 then 女 else 其他 end case搜尋函式 case when 1 then 男 when 2 t...