正如我的问题所指出的,我想知道我们在WHERE子句中如何称呼具有这种条件的查询类型,即:
WHERE
SELECT * FROM mytable WHERE (col1, col2) < (1, 2);
换句话说: 给我所有col1小于‘1’的记录,或者如果它等于‘1’则col2必须小于‘2’-并且所有值都不为NULL。
col1
col2
我真的很喜欢这种类型的语法,但是不知道有关如何引用这种条件的命名约定。它看起来像是有条件的元组,但是这个名字并没有给我任何东西。
我的问题源于需要了解该语法的名称,以便研究如何使用带有Hibernate和JPA2和Postgres的Criteria API编写此语法。
我能够使用CriteriaBuilder的function()调用使用Criteria API编写此代码:
//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函数调用的说明进行操作。
current
greaterThan
常见的短期只是 “行值” 。或针对您演示的操作的 “行值比较” 。自SQL-92(!)起,该功能已成为SQL标准。当前,Postgres是唯一在各个方面都支持它的主要RDBMS,尤其是在具有最佳索引支持的情况下。
特别地,该表达式(col1, col2) < (1, 2)只是ROW(col1, col2) < ROW(1, 2)Postgres中的简写形式。表达ROW(col1, col2)也被称为行构造 -就像ARRAY[col1, col2]是一个数组构造。
(col1, col2) < (1, 2)
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, col2)
(col1 DESC, col2 DESC)
并且明显不同于(!)
col1 < 1 AND AND col2 < 2
考虑示例:(1,1)…
(1,1)
这是Markus Winand的演讲,详细讨论了分页功能:
在use-the-index-luke.com上“分页完成了PostgreSQL的方式”。
行值比较从第20页开始。我一直在参考的支持矩阵在第45页。
我绝不隶属于我引用的任何消息来源。