我目前正在使用hsqldb中的sql调用java函数。 这个问题看起来很棘手,我想这可能是由于sql语句的不同部分的执行顺序。但我希望有人知道另一种解释。
基本理念: 我想检查列"一个"大于列"两个"表" A"。
问题: 我必须将字符串列转换为整数。如果存在演员问题,则该声明不应中止。
我的解决方案(不起作用): 我选择了所有可以安全投射的行。这些剩余的行被转换为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是否具有正确的格式和范围
编辑:表格看起来像这样(所有varchar):
A
num one two
123 1 2
123 x 2
B
num type
123 int500
不幸的是,我从中得到了一个SqlDataException。如果我执行以下操作,它将起作用:
1)用直接输入替换B.type(如:checkCast(A.one,' int500'))
2)或者在也使用B.type
的函数中进行比较我猜不知道外部select语句必须以某种方式在内部select语句结束之前访问数据?
感谢您的任何建议!
答案 0 :(得分:0)
在HSQLDB帮助论坛上询问并回答:
https://sourceforge.net/p/hsqldb/discussion/73674/thread/b246f577/
基本上,查询优化器决定何时评估每个表达式。您可以使用SQL或JAVA编写的函数替换CHECKCAST函数以执行比较,同时考虑通过在内部捕获异常并返回结果而无法转换的任何空值或值。