1

我有以下 SQL 案例语句。

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 错误 #1312311 的方法而嵌入到我们的客户端中的。OHD 显然代表“Oracle Hack Double”。

4

2 回答 2

1

你的情况好像不太对。

在没有一些编码干预的情况下,Oracle 本身不会仅根据列别名转换类型。

但是,要完全确定您的返回类型,您可以在语句中CAST选定的值。SELECT

于 2013-05-13T18:05:36.237 回答
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 (我只使用 NUMBER 类型),但您明确指出“source_one 和 source_two 是双精度”,所以我推断出这一点。

于 2013-05-13T18:13:10.760 回答