??? 最近發(fā)現(xiàn)oracle數(shù)據(jù)庫中一個(gè)自帶的函數(shù)decode。
??? 查看了一下用法,簡直了。真是太好用了,看來多看API,真的可以短時(shí)間讓我們有很大的提升。(雖然我也是讀代碼的過程中看到的~~)
??? DECODE是Oracle公司獨(dú)家提供的功能(ps:informix數(shù)據(jù)庫也提供該函數(shù)),它是一個(gè)功能很強(qiáng)的函數(shù)。它雖然不是SQL的標(biāo)準(zhǔn),但對于性能非常有用。到目前,其他的數(shù)據(jù)庫供應(yīng)商還不能提供類似DECODE的功能,甚至有的數(shù)據(jù)庫的供應(yīng)商批評Oracle的SQL不標(biāo)準(zhǔn)。實(shí)際上,這種批評有些片面或不夠水平。就象有些馬車制造商抱怨亨利·福特的“馬車”不標(biāo)準(zhǔn)一樣。(來自百度百科)
??? 一種吃不到葡萄說葡萄酸的感覺。但是為何說這個(gè)函數(shù)很強(qiáng)大呢,因?yàn)槟阍跀?shù)據(jù)庫中寫了很多行的If函數(shù),可能用了decode函數(shù)后,一行就可以解決。寫完后,代碼簡潔明了,絕對上升了好幾個(gè)檔次。
??? 說一下具體的用法,你真的會“臥槽,這么強(qiáng)”
? ? decode(條件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值),這行代碼就是decode全部的精髓以及用法。
? ? 該函數(shù)的含義如下:
IF 條件=值1 THEN? RETURN(返回值1)
ELS IF 條件=值2 THEN? RETURN(返回值2)
......
ELSIF 條件=值n THEN? RETURN(返回值n)
ELSE? RETURN(缺省值)
END IF
decode(字段或字段的運(yùn)算,值1,值2,值3)
??? 這個(gè)函數(shù)運(yùn)行的結(jié)果是,當(dāng)字段或字段的運(yùn)算的值等于值1時(shí),該函數(shù)返回值2,否則返回值3
??? 當(dāng)然值1,值2,值3也可以是表達(dá)式,這個(gè)函數(shù)使得某些sql語句簡單了許多
下面舉兩個(gè)栗子:
栗子1:
??? 你要統(tǒng)計(jì)students表中,男生女生的數(shù)量:
??? 傳統(tǒng)寫法如下:
select count(*) from students where 性別 = 男;
select count(*) from students where 性別 = 女;
??? 然后使用Union連接,得到最終的統(tǒng)計(jì)結(jié)果。
??? 現(xiàn)在你只需要這樣來寫:
select decode(性別,男,1,0),decode(性別,女,1,0) from students
栗子2:
??? 應(yīng)用到order by 排序中:
??? 在表中,有一列為學(xué)科,分別為語文,數(shù)學(xué),英語,自然,美術(shù)等等,你要將表中信息按照學(xué)科分類。
??? 可以使用decode這樣來寫:
select * from 學(xué)科 order by decode(學(xué)科, '語文', 1, '數(shù)學(xué)', 2, , '外語',3...)
??? 上面兩個(gè)例子,可以說明使用decode可以使我們sql代碼簡潔明了,可讀性更強(qiáng)。
每天進(jìn)步一點(diǎn)點(diǎn)。
推薦微信公眾號【排骨肉段】,記錄日常的美好。