2013-05-13 23 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是双精度”,所以我推断出这一点。