[英]Why is Oracle's DECODE giving me a different value than NVL?
該查詢:
select nvl(0.75,0) from dual
給我0.75
(數字),但此查詢:
select decode(1,0,null,0.75) from dual
給我'.75'
(字符串)。
為什么?
我試圖通過將第二個查詢更改為解決此問題:
select decode(1,0,null,to_char(0.75,'0.99')) from dual
但在我的實際代碼中,0.75將是一個字段(NUMBER),該字段可能具有不同的小數位數,並且我不認為要從該值中添加/刪除任何內容。
關於如何解決丟失的零問題但仍支持所有可能的十進制長度的任何想法?
這是因為您的解碼語句的第三個參數為NULL。 根據文檔 1 (我的重點)。
在比較之前, Oracle自動將expr和每個搜索值轉換為第一個搜索值的數據類型。如果第一個結果的數據類型為CHAR或第一個結果為null,則Oracle會將返回值轉換為數據類型VARCHAR2 。
在您的情況下,第一個結果是NULL,Oracle將其視為VARCHAR2。 您的返回值正在隱式轉換為VARCHAR2。 如果將DECODE()
更改為以下數字,則會得到一個數字:
select decode(1, 0, 0, 0.75)
您可以使用NULLIF()
函數來實現NULL:
select nullif(decode(1, 0, 0, 0.75), 0) ...
最好使用CASE語句,該語句強制所有返回的數據類型都相同:
select case 1 when 0 then null
else 0.75
end ...
1.我也被抓住了。
您可以使用
select decode(1,0,to_number(null),0.75) from dual
在第一種情況下, nvl()
返回一個數值。 如何顯示取決於您用來運行查詢的程序。 TOAD像您說的那樣顯示0.75。
在第二個示例中, decode()
返回varchar2
。 當Oracle將數字轉換為沒有任何格式的字符串時,這就是您得到的,即“ .75”。
從Oracle文檔上的decode()
:
如果第一個結果的數據類型為CHAR或第一個結果為null,則Oracle將返回值轉換為數據類型VARCHAR2。
您可以使用數字格式和rtrim()
來實現您的目的,例如:
select rtrim(to_char(.75, '9990.99999999999999'),'0') from dual;
結果:
0.75
select to_number(decode(1,0,null,0.75)) from dual
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.