【问题标题】:Returning boolean from DB2 using JPQL使用 JPQL 从 DB2 返回布尔值
【发布时间】:2015-06-29 07:45:25
【问题描述】:

作为复合 JPQL 查询的一部分,我正在使用子选择

(select count(obj)=0 from TABLE_NAME obj where obj.id = outerObject.id) 

如果对象在 TABLE_NAME 中被删除,它应该返回布尔值。它在使用 H2 运行时效果很好,但在使用 DB2 9.7.0.4 运行时失败并出现语法错误。

我尝试在两个数据库上执行一些类似的裸 sql 查询,H2 可以毫无问题地执行所有这些查询,但是我无法在 DB2 中返回布尔值,例如

SELECT count(*)=0 from TABLE_NAME

失败并出现语法错误以及

SELECT 1=0 from TABLE_NAME

IBM 说 boolean 类型是在 9.7 中引入的,但我对用法感到困惑。页面http://www-01.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.apdv.sqlpl.doc/doc/c0053651.html

布尔数据类型只能引用为:(...)返回类型

但它也说

结果集中不能返回布尔数据类型。

是否可以在 DB2 中执行布尔返回查询,或者我必须将 count(*) 返回给 Java 并在 Java 端检查它是否为零?

【问题讨论】:

  • BOOLEAN 数据类型仅在 SQL PL 上下文(即存储过程、函数等)中可用,但在 SQL 本身中不可用。

标签: java sql db2 jpql


【解决方案1】:

您可以将其替换为存在查询:

WHERE NOT EXISTS (select obj from TABLE_NAME obj where obj.id = outerObject.id) 

0 的 count(obj) 值也应该被解释为 false,所以你可以简单地否定

【讨论】:

  • 感谢您的回答。不幸的是,我没有在子查询中使用子选择,但我将其值作为选定值之一返回 - 类似于 select outerObject.name, (select obj from TABLE_NAME...) from OuterObject outerObject
【解决方案2】:

您可以创建一个 udf(用户定义的函数)来解析布尔值并返回一个字符串

Create function bool_to_char (boolean value) return char (5)
Begin
 Declare ret char (5) default 'false';
 If (value is true) then
  Set ret = 'true';
  End if;
  Return ret;
 End@

你用函数调用同一个select

Select bool_to_char (xxx) from ....

【讨论】:

    猜你喜欢
    • 2012-08-16
    • 2018-08-22
    • 1970-01-01
    • 2020-02-10
    • 2019-03-12
    • 2013-03-11
    • 2018-06-03
    • 1970-01-01
    相关资源
    最近更新 更多