狠狠色丁香婷婷综合尤物/久久精品综合一区二区三区/中国有色金属学报/国产日韩欧美在线观看 - 国产一区二区三区四区五区tv

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

使用coalesce和nullif的組合來(lái)減輕寫(xiě)sql的工作量

admin
2011年8月2日 17:11 本文熱度 2852

今天幫朋友調(diào)了一個(gè)網(wǎng)站,無(wú)意中翻了一個(gè)sp,看到了一段很長(zhǎng)的select語(yǔ)句,這個(gè)select語(yǔ)句之所以長(zhǎng),是因?yàn)橛泻脦讉€(gè)一般復(fù)雜的case語(yǔ)句跟在select的后面。我們摘取其中的一個(gè)字段的邏輯規(guī)則和數(shù)據(jù)來(lái)做我們的測(cè)試數(shù)據(jù):


create table tbl (id int, type_a int)

insert into tbl values (1000,1000)
insert into tbl values (999,999)
insert into tbl values (998,998)
insert into tbl values (997,997)
insert into tbl values (996,996)
insert into tbl values (995,null)
insert into tbl values (994,null)
insert into tbl values (993,null)
insert into tbl values (992,null)
insert into tbl values (991,null)

邏輯非常簡(jiǎn)單:當(dāng)type_a為997或null的時(shí)候,我們要讓輸出的type_a字段值為0。
OK,這個(gè)SQL語(yǔ)句當(dāng)然有多種寫(xiě)法,朋友的sql是這樣寫(xiě)的:


select
    
case
        
when (type_a is null or type_a=997then 0
        
else type_a
    
end as type_a
from tbl

如果需要控制的字段一多,那這個(gè)及時(shí)已經(jīng)使用了縮進(jìn)的select也看起來(lái)很復(fù)雜了,時(shí)間久了想改動(dòng)這個(gè)sp的邏輯就有些吃力了,我們常常在做計(jì)劃時(shí)會(huì)說(shuō)“半小時(shí)搞定這個(gè)問(wèn)題”,但是往往在做的時(shí)候都會(huì)超過(guò)這個(gè)時(shí)間,原因就在于我們總有從一團(tuán)亂麻中找到入手點(diǎn)。復(fù)雜的代碼和邏輯往往是解決問(wèn)題中難啃的骨頭。那么有什么好辦法優(yōu)化一下嗎?


select coalesce(nullif(type_a,997),0as type_a from tbl

Well,上面寫(xiě)了6行的sql就被這1行所替代了。

nullif接受兩個(gè)參數(shù),如果兩個(gè)參數(shù)相等,那么返回null,否則返回第一個(gè)參數(shù)
coalesce接受N個(gè)參數(shù),返回第一個(gè)不為null的參數(shù)

So,當(dāng)您遇到處理一個(gè)如下所示的計(jì)算工資的問(wèn)題的時(shí)候,不妨這樣來(lái)解決:


create table salary (e_id uniqueidentifier, byMonth int, byHalfYear int, byYear int)

insert into salary values (newid(),9000,null,null)
insert into salary values (newid(),null,60000,null)
insert into salary values (newid(),null,null,150000)

每個(gè)雇員有3種薪資計(jì)算方式(按月,按半年,按年)來(lái)發(fā)放工資,如果我們想統(tǒng)計(jì)每個(gè)員工的年薪,那這樣一句就夠了:


select e_id,coalesce(byMonth*12,byHalfYear*2,byYear) as salary_amount from salary

結(jié)果:


e_id                                                 salary_amount
------------------------------------ -------------
8935330D-2B73-4FEF-941A-768D7A8CCB6C 108000
52A3CE16
-74FD-4D5D-BB4F-F5F67A1E9D2F 120000
06B6B924
-EAB2-4187-B733-EBB56B62E793 150000

參考:
COALESCE (Transact-SQL)
NULLIF (Transact-SQL)

該文章在 2011/8/2 17:11:42 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved