gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:33:26 24 4
gpt4 key购买 nike

正如我的问题所述,我想知道我们将 WHERE 子句中具有该类型条件的查询类型称为什么,即:

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

换句话说:
给我所有 col1 小于 '1' 的记录,或者如果它等于 '1' 那么 col2 必须小于 '2' - 并且没有一个值是 NULL。

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

我的问题源于需要知道这种语法是什么,以便研究如何使用 Criteria API 编写它。使用 Hibernate、JPA2 和 Postgres。

编辑

我能够使用 Criteria API 使用 CriteriaBuilder's 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-92 以来一直在 SQL 标准中(!)。 Postgres 是目前唯一在所有方面都支持它的主要 RDBMS - 特别是还具有最佳索引支持。

特别是表达式 (col1, col2) < (1, 2)只是 ROW(col1, col2) < ROW(1, 2) 的简写在 Postgres 中。表达式 ROW(col1, col2)也称为 row constructor - 就像 ARRAY[col1, col2]是一个 array constructor .

它是更冗长的等效表达式的缩写:

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

... Postgres 可以在 (col1, col2) 上使用索引或 (col1 DESC, col2 DESC)为此。

并且明显不同于:(!)

col1 < 1 AND  AND col2 < 2

考虑示例:(1,1) ...

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

"Pagination done the PostgreSQL way" on use-the-index-luke.com .

行值比较从第 20 页开始。我一直提到的支持矩阵在第 45 页。
我绝不隶属于 Markus Winand。

关于 'WHERE (col1, col2) < (val1, val2)' 的 SQL 语法术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32981903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com