【问题标题】:Specifying the return type of SQL case statement指定 SQL case 语句的返回类型
【发布时间】: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 的列,这可能会混淆客户端也是?它不会混淆查询本身,但也许您有一个从表定义推断类型的层。似乎不太可能......
  • 我刚刚让管理员在我们的客户端之外运行代码。数据类型的东西被烘焙到客户端中。谢谢你们的帮助。

标签: sql oracle oracle11g


【解决方案1】:

你的情况似乎不对。

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

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

【讨论】:

  • ohd_ 前缀被嵌入到我们的客户端中。代码正在执行转换。感谢您的帮助。
【解决方案2】:

请发布一个简单的示例,说明您所说的内容。除非我误解了您的情况,否则我看不到任何转换发生。

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

【讨论】:

    猜你喜欢
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2022-10-13
    相关资源
    最近更新 更多