SQL 'WHERE (col1, col2) < (val1, val2)' 的语法术语
SQL syntax term for 'WHERE (col1, col2) < (val1, val2)'
正如我的问题所述,我想知道我们将 WHERE
子句中具有该类型条件的查询类型称为什么,即:
SELECT * FROM mytable
WHERE (col1, col2) < (1, 2);
换句话说:
给我所有 col1
小于 '1' 的记录,或者如果它等于 '1' 那么 col2
必须小于 '2' - 并且 none 个值为 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
函数调用的说明进行操作。
WHERE (col1, col2) < (val1, val2)
以上语法称为行值构造函数/元组语法/行子查询.
来自doc
ANSI SQL row value constructor syntax, sometimes referred to AS tuple
syntax, even though the underlying database may not support that
notion. Here, we are generally referring to multi-valued comparisons,
typically associated with components
或者它可以被称为Row Subqueries
在比较谓词中使用行值构造函数 (RVC) - 相当长期
RVC 通常出现在 INSERT 语句中,但很少作为 WHERE 子句的一部分。
我怀疑这种语法是否在 JPA 或 Hibernate Criteria 中有直接支持API,但总有一种解决方法可以实现相同的逻辑。
常见的短期术语就是“行值”。或 “行值比较” 用于您演示的操作。该功能自 SQL-92 (!) 以来一直在 SQL 标准中。 Postgres 是目前唯一在所有方面都支持它的主要 RDBMS - 特别是还具有最佳索引支持。
特别是,表达式 (col1, col2) < (1, 2)
在 Postgres 中对于 ROW(col1, col2) < ROW(1, 2)
只是 shorthand。
表达式 ROW(col1, col2)
也称为 row constructor - just like ARRAY[col1, col2]
is an 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
子句中具有该类型条件的查询类型称为什么,即:
SELECT * FROM mytable
WHERE (col1, col2) < (1, 2);
换句话说:
给我所有 col1
小于 '1' 的记录,或者如果它等于 '1' 那么 col2
必须小于 '2' - 并且 none 个值为 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
函数调用的说明进行操作。
WHERE (col1, col2) < (val1, val2)
以上语法称为行值构造函数/元组语法/行子查询.
来自doc
ANSI SQL row value constructor syntax, sometimes referred to AS tuple syntax, even though the underlying database may not support that notion. Here, we are generally referring to multi-valued comparisons, typically associated with components
或者它可以被称为Row Subqueries
在比较谓词中使用行值构造函数 (RVC) - 相当长期
RVC 通常出现在 INSERT 语句中,但很少作为 WHERE 子句的一部分。
我怀疑这种语法是否在 JPA 或 Hibernate Criteria 中有直接支持API,但总有一种解决方法可以实现相同的逻辑。
常见的短期术语就是“行值”。或 “行值比较” 用于您演示的操作。该功能自 SQL-92 (!) 以来一直在 SQL 标准中。 Postgres 是目前唯一在所有方面都支持它的主要 RDBMS - 特别是还具有最佳索引支持。
特别是,表达式 (col1, col2) < (1, 2)
在 Postgres 中对于 ROW(col1, col2) < ROW(1, 2)
只是 shorthand。
表达式 ROW(col1, col2)
也称为 row constructor - just like ARRAY[col1, col2]
is an 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 没有任何关系。