H2 DB 支持来自 SQL 的 IF 条件

H2 DB supporting IF conditionals from SQL

我在 JDBC 中有一个 sql 本机查询,它使用 IF 子句(我也尝试使用 CASE WHEN)并且它在生产中运行良好,因为我使用 MariaDB。但是对于我的单元测试,我们使用 H2,问题是 H2 不理解一些 sql 语法。

我在这里 找到了关于用户定义的 SQL 函数,我为 IF() sql 方法创建了别名函数,它适用于我需要的一种情况它工作。第一种情况如下IF(table.value = 0, 'yes', 'no'),但第二种情况使用嵌套比较器如下IF(table.value1 = 0 && table.value2 =0, 'yes', 'no'),在这种情况下它失败了。

这是我的 IF 用户自定义 SQL 函数

@SuppressWarnings("unused")
public class H2Function {
    public static String IF(Boolean condition, String ifTrue, String ifFalse) {
        return condition ? ifTrue: ifFalse;
    }
}

这里我是如何 link 它在 properties.yaml 文件中的

spring:
  datasource:
    url: jdbc:h2:mem:db__PRIMARY__;MODE=MySQL;DB_CLOSE_ON_EXIT=FALSE
    driver-class-name: org.h2.Driver
    hikari:
      connection-init-sql: "CREATE ALIAS IF NOT EXISTS IF DETERMINISTIC FOR \"com.package.test.H2Function.IF\";"

和本机查询定义

"SELECT user, Coalesce(AVG(value1), 0) AS avg1,"
" Coalesce(AVG(value2), 0) AS avg2, Coalesce(AVG(value3), 0) AS avg3, "
" IF(Coalesce(AVG(value1), 0)=0 && Coalesce(AVG(value2), 0)=0, 'yes', 'no') AS bottom " " FROM table tb ... "

由于查询别名无法正常工作,我无法在内部使用 avg1 和 avg2。 仅使用 IF(Coalesce(AVG(value1), 0)=0, 'yes', 'no')IF(Coalesce(AVG(value2), 0)=0, 'yes', 'no') 可以很好地处理我的用户定义的 sql 函数,但将两者与 && 一起使用会失败。 P.D.: 所有这些都是为了能够将所有具有 value1=value2=0 的记录排序到列表的底部,无论排序顺序如何,如果您知道一种无需进入的方法即可完成此操作好麻烦,求告知

解决了: 显然 H2 在解释 && 运算符时也有问题。我把它改成了 AND,它可以和 mySQL 中的 && 互换,现在 H2 解释它并测试通过,我在使用 MariaDB 部署时得到了想要的结果。

Whosebug question about AND-&&

doc on operators precedence

mySQL manual on AND,&&