【发布时间】:2015-12-01 06:42:03
【问题描述】:
我有以下 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 关键字?
非常感谢您的回复。
数据库版本:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit
编辑:作为我提到的 ohd_ 前缀的后续。事实证明,这是作为解决 oracle 错误 #1312311 的方法而嵌入到我们的客户端中的。 OHD 显然代表“Oracle Hack Double”。
【问题讨论】:
-
你为什么不直接使用
COALESCE(source_one,source_two)?如果 Oracle 由于您选择列前缀 BTW 而改变其行为,我会感到惊讶! -
+1 给托尼;希望这是一个答案。也从未听说过“ohd”前缀,但它可能与接收行的任何客户端有关。请注意,如果您只是运行“选择”,则列实际上并没有“类型”。
-
我认为不可能在 case 语句中混合两种列类型。 oracle 将隐式转换为 varchar2。
-
你还没有说你从哪里调用它,可能你的客户正在做一些奇怪的事情,但只是出于兴趣,你的表是否还有一个名为
source_value的列,这可能会混淆客户端也是?它不会混淆查询本身,但也许您有一个从表定义推断类型的层。似乎不太可能...... -
我刚刚让管理员在我们的客户端之外运行代码。数据类型的东西被烘焙到客户端中。谢谢你们的帮助。