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 中查询的意外行为的主要内容,如果未能解决你的问题,请参考以下文章

VBA DAO 直通查询意外行为

DB2 查询输出 - 不同的行为

BigQuery:写入查询结果时使用 bigquery 作业的意外行为

NHibernate:查询未映射实体时的意外行为

Python MySQLdb 意外行为(?)

MIN() MAX() BigQuery - 意外行为