前沿拓展:
isnull
”isnull式,所以具有完全不同底培乎次急散半孫容屬層結(jié)構(gòu)的不同數(shù)據(jù)庫(kù)系統(tǒng)可以使用相同的結(jié)構(gòu)化查詢語(yǔ)言作為數(shù)據(jù)輸入與管理的接口。SQL語(yǔ)言語(yǔ)句可孔鹽練錯(cuò)以嵌套,這使他具有極大的靈活性和強(qiáng)大的功能。
概述
由于業(yè)務(wù)的需要:查看某列值為NULL的記錄有多少。這是一個(gè)十分簡(jiǎn)單的需求,同時(shí)也很容易實(shí)現(xiàn)。無(wú)非就是使用如下語(yǔ)句:
SELECT * FROM table WHERE xx IS NULL;
結(jié)果得出的結(jié)果只有幾十條記錄,但是執(zhí)行的時(shí)間比我想象中的長(zhǎng)了許多。一般這樣的查詢只是要秒秒鐘的問(wèn)題,但是卻花了十幾秒,而平時(shí)使用IS NOT NULL也沒(méi)有那么慢啊。所以后面抽空就做了個(gè)實(shí)驗(yàn)來(lái)簡(jiǎn)單測(cè)試下。
基礎(chǔ)數(shù)據(jù)準(zhǔn)備DROP TABLE t PURGE;
CREATE TABLE t(a NUMBER);
CREATE INDEX idx_t ON t(a);
INSERT INTO t VALUES(NULL);
INSERT INTO t VALUES(NULL);
INSERT INTO t VALUES(1);
INSERT INTO t VALUES(1);
INSERT INTO t VALUES(1);
INSERT INTO t VALUES(1);
INSERT INTO t VALUES(1);
INSERT INTO t VALUES(1);
INSERT INTO t VALUES(1);
COMMIT;
–收集表統(tǒng)計(jì)信息
EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>’SCOTT’, tabname=>’T’);
EXEC DBMS_STATS.GATHER_INDEX_STATS(ownname=>’SCOTT’, indname=>’IDX_T’);
對(duì)比執(zhí)行計(jì)劃SET NULL UNKOWN –設(shè)置如果只為NULL就以UNKOWN顯示
SET AUTOTRACE ON EXPLAIN
SELECT * FROM t WHERE a IS NULL;
SELECT * FROM t WHERE a IS NOT NULL;
SELECT index_name, num_rows from user_indexes where index_name = ‘IDX_T’;
索引的統(tǒng)計(jì)信息是9和表的行數(shù)是一樣的。
篇幅有限,就寫(xiě)到這里了,這里大家可以抽空自己用函數(shù)索引來(lái)測(cè)試下,看到的num_rows也會(huì)不一樣的,后面會(huì)分享更多devops和DBA方面的內(nèi)容,感興趣的朋友可以關(guān)注一下~
拓展知識(shí):
isnull
isnull(參數(shù)1,參數(shù)2) 判斷參數(shù)1 是否為NULL,如果是 返回參數(shù)2 否則返回參數(shù)1.
isnull(列名,0) : isnull()函數(shù)是用來(lái)判斷列名是否為null 如果為NUll 則返回0 否則 返回列名的值
<>:是不等號(hào) 與!= 一樣 比如: select 3 where 1<>2 查出來(lái)的結(jié)果是3 select 3 where 1<>1則查不出結(jié)果。
isnull(列名,0)<>0: 先判斷 列名是否為null ,第二再與0比較 不等于零返回結(jié)果為T(mén)rue 否則為False
列如:isnull(3,0) 返回的結(jié)果為 3 因?yàn)? 不是null.
isnull(null,'空') 返回結(jié)果是'空'
希望對(duì)你有幫助,不懂可以追問(wèn)。
本回答被提問(wèn)者采納
isnull
對(duì)于 isnull(列名,0)
isnull 是一個(gè)函數(shù)
2個(gè)參數(shù)
如果第一個(gè)參數(shù) 非空, 那么返回第一個(gè)參數(shù), 否則返回第二個(gè)參數(shù).
例如 有個(gè)圖書(shū)館的系統(tǒng), 在學(xué)生畢業(yè)離校前, 需要查詢 這個(gè)學(xué)生 的 借書(shū)數(shù)量.
SELECT
學(xué)生表.學(xué)號(hào),
isnull( SUM( case when 借書(shū)表.還書(shū)標(biāo)志 = 0 THEN 1 ELSE 0 END ) , 0) AS 未還書(shū)數(shù)量
FROM
學(xué)生表 LEFT JOIN 借書(shū)表 ON ( 學(xué)生表.學(xué)號(hào) = 借書(shū)表.學(xué)號(hào) )
GROUP BY
學(xué)生表.學(xué)號(hào)
isnull(列名,0)<>0
是一個(gè)條件。
等價(jià)于 列名 is not null AND 列名 <> 0
還是上面那個(gè)例子
要篩選出那些 還有書(shū)沒(méi)有還的學(xué)生
SELECT
學(xué)生表.學(xué)號(hào),
isnull( SUM( case when 借書(shū)表.還書(shū)標(biāo)志 = 0 THEN 1 ELSE 0 END ) , 0) AS 未還書(shū)數(shù)量
FROM
學(xué)生表 LEFT JOIN 借書(shū)表 ON ( 學(xué)生表.學(xué)號(hào) = 借書(shū)表.學(xué)號(hào) )
GROUP BY
學(xué)生表.學(xué)號(hào)
HAVING
isnull( SUM( case when 借書(shū)表.還書(shū)標(biāo)志 = 0 THEN 1 ELSE 0 END ) , 0) <> 0
isnull
如題,顧名思義;
isnull(列名,0) 就是字段的查詢結(jié)果為空就替換成0;
isnull(列名,0)<>0 這個(gè)比較前面一個(gè)就多了個(gè)判斷<> 不等于
很好理解的;
引用demo:
isnull(3,0) 返回的結(jié)果為 3 因?yàn)? 不是null.
isnull(列名,0)<>0: 先判斷 列名是否為null ,第二再與0比較 等于零返回結(jié)果為T(mén)rue 否則為False
isnull
isnull(列名,0)這是個(gè)值,isnull(列名,0)<>0這是個(gè)布爾值
前者就是1、2、3、4之類(lèi)的值,后者就僅是true或false兩個(gè)值,用來(lái)判斷用的
追問(wèn)
where isnull(unitprice,0)0的意思,是否就是:不為null和0執(zhí)行計(jì)算,為null的話不執(zhí)行計(jì)算,顯示0
追答
額。。你是不知道isnull函數(shù)啊,isnull(表達(dá)式1,表達(dá)式2)
驗(yàn)證表達(dá)式1是否是null值,若不是則isnull(x,y)的值就為表達(dá)式1的值
若是null值,則isnull(x,y)值就改為表達(dá)式2的值
where isnull(unitprice,0)0的意思就是,判斷字段unitprice是否為null
是的話就把unitprice的null值當(dāng)做0處理,不是null的話就還是unitprice字段本身的值
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請(qǐng)注明出處:http:///35035.html