'WHERE (col1, col2) 的 SQL 语法术语 < (val1, val2)'

问题描述 投票:0回答:3

正如我的问题所述,我想知道在

WHERE
子句中具有该类型条件的查询类型,即:

SELECT * FROM mytable
WHERE (col1, col2) < (1, 2);

换句话说:
给我所有

col1
小于“1”的记录,或者如果它等于“1”,则
col2
必须小于“2” - 并且没有一个值为 NULL。

我真的很喜欢这种类型的语法,但不知道如何引用这种类型的条件的命名约定是什么。它看起来像一个条件元组,但该名称没有从我的搜索中提供任何信息。

我的问题源于需要知道这个语法的名称,以便研究如何使用 Criteria API 与 Hibernate、JPA2 和 Postgres 来编写它。

编辑

我能够使用 Criteria API 使用 CriteriaBuilder 的 function() 调用来编写此内容:

//Our left expression (date, id)
Expression leftVal = criteriaBuilder.function("ROW", Tuple.class,     
        from.get("date").as(java.util.Date.class),
        from.get("id").as(Long.class));

//Our right expression ex: ('2015-09-15', 32450)
ParameterExpression<Date> dateParam = criteriaBuilder.parameter(Date.class);
ParameterExpression<Long> idParam = criteriaBuilder.parameter(Long.class);
Expression rightVal = criteriaBuilder.function("ROW", Tuple.class, dateParam, idParam)

//build the first predicate using ROW expressions
Predicate predicate = criteriaBuilder.greaterThan(leftVal, rightVal);

//more query building happens
... 

//construct final query and add parameters to our param expressions
TypedQuery<MyEntity> typedQuery = em.createQuery(criteriaQuery);
typedQuery.setParameter(dateParam, current.getDate());
typedQuery.setParameter(idParam, current.getId());
在这种情况下,

current
是我检索的记录,作为我们想要在之前或之后获取记录的行。在此示例中,我按照
greaterThan
函数调用所述进行操作。

sql hibernate postgresql pagination criteria
3个回答
9
投票

您演示的操作的常用术语有 “行值”“行值比较”“行构造函数比较”“逐行比较”
常用于“按键集分页”

该功能自 SQL-92 以来一直存在于 SQL 标准中(!)。 Postgres 是目前唯一在各个方面支持它的主要 RDBMS - 特别是还提供完整的索引支持。

表达式

(col1, col2) < (1, 2)
是 Postgres 中
ROW(col1, col2) < ROW(1, 2)
的简短语法。
表达式
ROW(col1, col2)
是一个 “行构造函数”,就像
ARRAY[col1, col2]
是一个 “数组构造函数”

逐行比较可以方便地缩写为更详细、等效的表达式:

col1 < 1 OR (col1 = 1 AND col2 < 2)

Postgres 可以在 (col1, col2)(col1 DESC, col2 DESC) 上使用

多列索引
来实现此目的。但不是像
(col1 ASC, col2 DESC)
这样具有混合排序方向的索引!

该表达方式明显不同于:(!)

col1 < 1 AND  AND col2 < 2

考虑示例行值:

(1,1)
...

这是 Markus Winand 的演示,详细讨论了分页功能:

use-the-index-luke.com 上的“以 PostgreSQL 方式完成分页”

行值比较从第 20 页开始。我一直提到的支持矩阵在第 45 页。
我与 Markus Winand 没有任何关系。


0
投票
WHERE (col1, col2) < (val1, val2)

以上语法称为行值构造函数/元组语法/行子查询

来自文档

ANSI SQL 行值构造函数语法,有时称为 AS 元组 语法,即使底层数据库可能不支持该语法 概念。这里,我们一般指的是多值比较, 通常与组件相关

或者也可以称为 Row Subqueries


0
投票

表达式列表

在比较谓词中使用行值构造函数(RVC)——一个相当长的术语

RVC 通常出现在 INSERT 语句中,但很少作为 WHERE 子句的一部分。

我怀疑这种语法在 JPA 或 Hibernate Criteria API 中是否有直接支持,但总有一种解决方法可以实现相同的逻辑。

© www.soinside.com 2019 - 2024. All rights reserved.