資料庫應用軟體很多時候將多重的、相關的實體資訊儲存在同乙個**中。例如,購買的零件和本地生產的零件都是零件,經理和工人都是員工,儘管多重的實體
型別在資料儲存上略有不同,但是它們有太多的相同之處,因此通常使用乙個**而不是兩個。
處理這樣的**通常意味著對每一行進行條件測試來檢查哪個實體型別正在被處理,然後返回每種型別的不同結果集。case語句可以用來完成這一工作。
從oracle 9i版開始,coalesce函式在很多情況下就成為替代case語句的一條捷徑,coalesce的格式如下:
coalesce (expression_1, expression_2, ...,expression_n)
列表中第乙個非空的表示式是函式的返回值,如果所有的表示式都是空值,最終將返回乙個空值。
使用coalesce的秘密在於大部分包含空值的表示式最終將返回空值(連線操作符「||」是乙個值得注意的例外)。例如,空值加任何值都是空值,空值
乘任何值也都是空值,依此類推。
這樣您就可以構建一系列表示式,每個表示式的結果是空值或非空,這就像乙個case語句,表示式按照順序進行測試,第乙個滿足條件的值就確定了結果。
列表a展示了名為parts的**的一部分,該**儲存了購買的零件資料和生產的零件資料,如果是購買的零件,那麼part_type列的值為『p』,
如果是本地生產或組裝的則是『b』;此外,對於購買的零件,purchase_cost 列會顯示購買成本,而本地生產的零件則是空值;而且,本地生產
的零件還有material_qty和material_cost兩列的資訊,對於購買的零件則是空值。
您可以使用乙個case語句來測試part_type列的值並返回either purchase_cost和material_qty列與
material_cost列的乘積;不過coalesce可以用一行語句解決這個問題:
coalesce(purchase_cost, material_qty * material_cost)
如果資料行中儲存的是乙個購買的零件,那麼purchase_cost就不是空值,將返回purchase_cost的值;然而,對於本地生產的零
件,purchase_cost是空值,coalesce會忽略它,然後將material_qty和material_cost相乘,並將乘積作為結
果返回。
select part_id "part", part_type "type",
coalesce(purchase_cost, material_qty * material_cost) "cost"
from parts;
您可以對任何數量的表示式重複使用這個模式,coalesce是乙個非常便捷的方法對統一**中的多重實體求值。
最後,還要說一點case語句的優點,就是case是自動進行文件記錄的,這便於理解和解讀正在發生的事情。
Oracle 如何使用
法1 win r cmd sqlplus as sysdba 以sysdba身份登入 法2 win r cmd sqlplus username password 以指定使用者名稱 密碼身份登入 法3 win r cmd sqlplus 按照提示,輸入使用者名稱密碼 法4 直接找到安裝目錄,開啟sq...
如何使用Oracle序列
如何使用oracle序列 oracle序列 sequence 是一種資料庫項,能夠生成乙個整數序列。通常用於填充數字型別的主鍵列。1 建立序列 create sequence sequence name start with start num increment by increment num ...
如何監控oracle的索引是否使用
很多軟體開發過程中,沒有注意合理規劃索引,造成乙個表上有n多個索引,為後續的維護和優化帶來麻煩。因此有時候需要監控已有的索引是否在使用,oracle提供了監控索引是否使用的工具,很簡單,簡要介紹一下。首先,我們如果是監控乙個表上的所有索引,可以這樣先生成監控的命令 然後執行這些指令碼就開始監控了,監...