2013-05-13 85 views
1

我有以下SQL case語句。指定SQL case語句的返回類型

select tracking_num, 
case 
    when source_one is not null then source_one 
    else source_two 
end source_value 
from ... 

source_one和source_two是雙精度。如果我執行上面的SQL,那麼返回的source_value列是int精度的。

一位同事建議在列名的開頭添加ohd_。

select tracking_num, 
case 
    when source_one is not null then source_one 
    else source_two 
end ohd_source_value 
from ... 

這將返回正確的值(返回的列名爲'source_value')。

ohd_前綴是oracle標準嗎?我無法在任何地方找到文檔。另外,是否有更好的方式來執行此轉換?也許通過使用CAST關鍵字?

謝謝您的提前回復。

DB版本:Oracle數據庫11g企業版發佈11.2.0.3.0 - 64位

編輯:作爲隨訪到我提到的ohd_前綴。事實證明,這被烘焙到我們的客戶端作爲一個解決oracle的bug#1312311。 OHD顯然代表「Oracle Hack Double」。

+5

你爲什麼不使用'COALESCE(source_one,source_two)'?如果Oracle因爲您選擇的列前綴BTW而改變其行爲,我會感到驚訝! – 2013-05-13 17:50:52

+0

+1給Tony;希望它是一個答案。從未聽說過「哦」前綴,但它可能與任何客戶端正在接收行有關。請注意,如果您只是運行「選擇」,那麼這些列並沒有真正的「類型」。 – BellevueBob 2013-05-13 17:56:04

+0

我不認爲在case語句中混合兩種列類型是不可能的。 oracle會隱式轉換爲varchar2。 – haki 2013-05-13 18:10:07

回答

1

你的情況似乎不對。

Oracle本身沒有一些編碼干預,只是基於列別名轉換類型。

但是,要完全確定您的退貨類型,您可以在SELECT聲明中選擇CAST

+0

ohd_前綴被烘焙到我們的客戶端。代碼正在執行轉換。感謝您的幫助。 – 2013-05-13 18:23:23

0

請張貼一個簡單的例子來說明你所說的話。除非我誤解你的情況,否則我不會看到任何轉換髮生。

SQL> drop table testx 
Table dropped. 
SQL> create table testx 
(
pk number, 
d1 BINARY_DOUBLE 
) 
Table created. 
SQL> drop table testy 
Table dropped. 
SQL> create table testy 
(
    pk number, 
    d1 BINARY_DOUBLE 
) 
Table created. 
SQL> insert into testx values (1, 100) 
1 row created. 
SQL> insert into testx values (2, null) 
1 row created. 
SQL> insert into testy values (1, 200) 
1 row created. 
SQL> insert into testy values (2, 201) 
1 row created. 
SQL> commit 
Commit complete. 
SQL> drop table testz 
Table dropped. 
SQL> create table testz as 
select x.pk, 
case when (x.d1 is not null) then x.d1 
else y.d1 
end new_d1 
from testx x, testy y 
where x.pk = y.pk 
Table created. 
SQL> select column_name || ' => ' || data_type 
from user_tab_columns 
where table_name = 'TESTZ' 

COLUMN_NAME||'=>'||DATA_TYPE              
-------------------------------------------------------------------------------- 
PK => NUMBER                  
NEW_D1 => BINARY_DOUBLE               

2 rows selected. 

另外請注意,我通常不使用BINARY_DOUBLE(我只用數字類型),但您特別聲明「source_one和source_two是雙精度」,所以我推斷出這一點。