当前位置: 首页 > 面试题库 >

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

仲涵亮
2023-03-14
问题内容

正如我的问题所指出的,我想知道我们在WHERE子句中如何称呼具有这种条件的查询类型,即:

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

换句话说:
给我所有col1小于‘1’的记录,或者如果它等于‘1’则col2必须小于‘2’-并且所有值都不为NULL。

我真的很喜欢这种类型的语法,但是不知道有关如何引用这种条件的命名约定。它看起来像是有条件的元组,但是这个名字并没有给我任何东西。

我的问题源于需要了解该语法的名称,以便研究如何使用带有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函数调用的说明进行操作。


问题答案:

常见的短期只是 “行值” 。或针对您演示的操作的 “行值比较”
。自SQL-92(!)起,该功能已成为SQL标准。当前,Postgres是唯一在各个方面都支持它的主要RDBMS,尤其是在具有最佳索引支持的情况下。

特别地,该表达式(col1, col2) < (1, 2)只是ROW(col1, col2) < ROW(1, 2)Postgres中的简写形式。表达ROW(col1, col2)也被称为行构造 -就像ARRAY[col1, col2]是一个数组构造。

它方便地表示更为冗长,等效的表达:

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的演讲,详细讨论了分页功能:

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

行值比较从第20页开始。我一直在参考的支持矩阵在第45页。

我绝不隶属于我引用的任何消息来源。



 类似资料:
  • 问题内容: 给定具有复合主键的表,是否存在用于编写查询的合法语法,例如: 如果这是不可能的,并且您无法修改架构,那么如何执行上述等效操作? 我还将在此处使用术语“复合主键”,“子选择”,“子选择”和“子查询”,以表示这些别名的搜索结果。 编辑 :我对标准SQL的答案以及将与PostgreSQL和SQLite 3一起使用的答案感兴趣。 问题答案: 更换你的。 或创建您的临时表并用它代替..

  • 问题内容: 我们正在使用SQL Server2005,但是这个问题可能适用于任何RDBMS。 从视图中选择所有列时,以下哪一项更有效? 或者 问题答案: 永远不要使用“选择*” !!!! 这是查询设计的基本规则! 这有多种原因。其中之一是,如果您的表上只有三个字段,并且您使用了调用查询的代码中的所有三个字段,则很有可能会随着应用程序的增长而向该表中添加更多字段,并且您的select *查询仅用于返

  • 问题内容: 我们正在使用SQL Server 2005,但是这个问题可能适用于任何RDBMS。 从视图中选择所有列时,以下哪一项更有效? 或者 问题答案: 永远不要使用“选择*” !!!! 这是查询设计的基本规则! 这有多种原因。其中之一是,如果您的表上只有三个字段,并且您使用了调用查询的代码中的所有三个字段,则很有可能会随着应用程序的增长而向该表中添加更多字段,并且您的select *查询仅用于

  • 给定table1.column1,我需要确定它是否有table2.column2的外键。 这个SQL将运行很多次,所以它需要相当快。 我见过一些解决方案,但是往往比我需要的更复杂(例如,数据库中的所有外键或表上的所有外键) 谢谢!

  • 问题内容: 我将如何在没有硬编码值的情况下编写此sql语句? 宁愿有这样的事情: 提前致谢.. 问题答案: 用您当前的方式构造SQL查询是一个糟糕的主意,因为它为各种SQL注入攻击打开了大门 。为了正确执行此操作,您必须改为使用“ 预备语句”。这也将解决您目前显然遇到的各种逃避问题。 请注意,这是一个昂贵的调用(除非您的应用程序服务器使用语句缓存和其他类似的功能)。从理论上讲,最好先准备一次语句,

  • 问题内容: 如何在SQL / MySQL中的UNION之后应用WHERE语句? 问题答案: 如果要将WHERE子句应用于UNION的结果,则必须将UNION嵌入到FROM子句中: 我假设TableA和TableB是联合兼容的。当然,您也可以将WHERE子句应用于UNION中的每个单独的SELECT语句。