db2 中查询的意外行为
Posted
技术标签:
【中文标题】db2 中查询的意外行为【英文标题】:Unexpected behavior of query in db2 【发布时间】:2017-09-21 14:15:48 【问题描述】:我在 db2 上执行以下查询,并期望输出为 Availability >> 3.50 但输出 Availability >> 3.50000000000000000000000000000 谁能告诉我我错过了什么。
with abc as
(
select 1+(5.0/2.0) cag_scr
from dual
)
select NVL('Availability', 'NA')||' >> '||MAX(DECODE('Availability','Availability', trunc(cag_scr,2)))
from abc;
【问题讨论】:
当它是关于 DB2 的时候,为什么你用 Oracle 来标记它?顺便说一句,3.50 和 3.50000000000000000000000000000 是相同的数字,那么您的问题在哪里?如果您想要一个包含格式化数字的字符串,请使用VARCHAR_FORMAT
。
当您在 Db2 上寻求帮助时,必须提供版本和平台详细信息。那是因为答案通常取决于这些信息。我的 Db2 上的 Oracle 样式语法产生结果 "Availability >> 3.5" 。所以你的配置决定了你的实际结果。
【参考方案1】:
Db2 数据库 Varchar2 compatibility
设置会影响此行为。
您的 db cfg 很可能有 Varchar2 compatibility = OFF
,这将产生您看到的结果。
但如果数据库是为 Oracle 兼容性正确创建的,那么 Varchar2 compatibility = ON
会产生我得到的结果 (3.5)。
您可以使用强制转换或函数更改表达式结果的数据类型。
例如:
当“Varchar2 兼容性 = OFF”时:
values 1+(5.0/2.0)
1
---------------------------------
3.50000000000000000000000000000
1 record(s) selected.
values (cast(1+(5.0/2.0) as decimal(4,2)))
1
------
3.50
1 record(s) selected.
values (decimal(1+(5.0/2.0),4,2))
1
------
3.50
1 record(s) selected.
【讨论】:
除了更改数据库配置还有其他方法或格式化功能吗【参考方案2】:谢谢你们!得到了问题的解决方案。
with abc as
(
select decimal(1+(5.0/2),2) cag_scr
from dual
)
select NVL('Availability', 'NA')||' >> '||MAX(DECODE('Availability','Availability', CAST(cag_scr AS DECIMAL(20,2))))
from abc
【讨论】:
以上是关于db2 中查询的意外行为的主要内容,如果未能解决你的问题,请参考以下文章