Sql调用的Java方法和执行顺序

Sql调用的Java方法和执行顺序,java,sql,hsqldb,Java,Sql,Hsqldb,我目前正在hsqldb中使用sql调用的java函数。 这个问题看起来很棘手,我想这可能是由于sql语句不同部分的执行顺序造成的。但我希望有人知道另一种解释 基本思想是: 我想检查表A的第1列是否大于第2列 问题是: 我必须将字符串列转换为整数。如果存在强制转换问题,则语句不应中止 我的解决方案不起作用: 我选择所有可以安全转换的行。其余的行被转换为int,可以进行比较 例如: select * from( select * from A INNER JOIN B ON A.num=B_

我目前正在hsqldb中使用sql调用的java函数。 这个问题看起来很棘手,我想这可能是由于sql语句不同部分的执行顺序造成的。但我希望有人知道另一种解释

基本思想是: 我想检查表A的第1列是否大于第2列

问题是: 我必须将字符串列转换为整数。如果存在强制转换问题,则语句不应中止

我的解决方案不起作用: 我选择所有可以安全转换的行。其余的行被转换为int,可以进行比较

例如:

select * from(
    select * from A INNER JOIN B ON A.num=B_num WHERE checkCast(A.one, B.type) = TRUE and checkCast(A.two, B.type) = TRUE
) WHERE cast(A.one as int) > cast(A.two as int)
checkCast是一个Java函数,它根据B.type检查参数a.one和a.two是否具有正确的格式和范围

编辑:这些表如下所示:

A
num    one    two
123    1      2
123    x      2

B
num    type
123    int500
不幸的是,我从中得到了一个SqlDataException。如果我执行以下操作,它将起作用:

1将B.type替换为如下直接输入:checkCastA.one,“int500”

2或者在同样使用B.type的函数中进行比较

我猜在内部select语句完成之前,外部select语句必须以某种方式访问数据


谢谢你的建议

这是在HSQLDB帮助论坛上询问和回答的:

基本上,查询优化程序决定何时计算每个表达式。您可以将CHECKCAST函数替换为用SQL或JAVA编写的函数来执行比较,同时考虑任何空值或无法强制转换的值,方法是在内部捕获异常并返回结果