JooQ中两个条件之间的异或比较
XOR comparison between two Conditions in JooQ
在 Postgre 的 WHERE 条件中SQL 我有以下形式的东西:
a != b
其中 a 和 b 是布尔值。
然而,JooQ 决定 boolean 是一个 Condition
,它只知道 or
和 and
。我可以转换为 DNF,但这大大降低了可读性(因为那样它就变成了(a and !b) or (!a and b)
)。
还有其他方法可以实现这个用例吗?
例子
假设我有以下 SQL 代码:
WHERE (field_a IS NOT NULL) != (field_b IS NULL)
我想将它转换成类似这样的 JooQ 代码:
where(DSL.field("field_a", Integer.class).isNotNull().notEq(DSL.field("field_b", Integer.class).isNull()))
我不能,因为 notEq
不是 Condition
class 上的方法。
有什么办法吗?
我发现我可以使用 DSL.field(Condition)
将 Condition
包装为 Field
。 Field
class 确实有一个 notEqual
方法。我之前的例子变成如下:
where(DSL.field(DSL.field("field_a", Integer.class).isNotNull()).notEqual(DSL.field(DSL.field("field_b", Integer.class).isNull()))))
我不认为它是最优雅的,但绝对比使用DNF更优雅。
在 Postgre 的 WHERE 条件中SQL 我有以下形式的东西:
a != b
其中 a 和 b 是布尔值。
然而,JooQ 决定 boolean 是一个 Condition
,它只知道 or
和 and
。我可以转换为 DNF,但这大大降低了可读性(因为那样它就变成了(a and !b) or (!a and b)
)。
还有其他方法可以实现这个用例吗?
例子
假设我有以下 SQL 代码:
WHERE (field_a IS NOT NULL) != (field_b IS NULL)
我想将它转换成类似这样的 JooQ 代码:
where(DSL.field("field_a", Integer.class).isNotNull().notEq(DSL.field("field_b", Integer.class).isNull()))
我不能,因为 notEq
不是 Condition
class 上的方法。
有什么办法吗?
我发现我可以使用 DSL.field(Condition)
将 Condition
包装为 Field
。 Field
class 确实有一个 notEqual
方法。我之前的例子变成如下:
where(DSL.field(DSL.field("field_a", Integer.class).isNotNull()).notEqual(DSL.field(DSL.field("field_b", Integer.class).isNull()))))
我不认为它是最优雅的,但绝对比使用DNF更优雅。