SQL syntax term for ‘WHERE (col1, col2) < (val1, val2)'

The common short term is just “Row values”. Or “Row value comparison” for the operation you demonstrate. That feature has been in the SQL standard since SQL-92 (!). Postgres is currently the only major RDBMS that supports it in all aspects – especially also with optimal index support.

In particular, the expression (col1, col2) < (1, 2) is just shorthand for ROW(col1, col2) < ROW(1, 2) in Postgres.
The expression ROW(col1, col2) is also called row constructor – just like ARRAY[col1, col2] is an array constructor.

It is conveniently short for the more verbose, equivalent expression:

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

… and Postgres can use an index on (col1, col2) or (col1 DESC, col2 DESC) for this.

And notably distinct from: (!)

col1 < 1 AND  AND col2 < 2

Consider example: (1,1)

Here is a presentation by Markus Winand that discusses the feature for pagination in detail:

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

Row value comparison starts on page 20. The support matrix I have been referring to is on page 45.
I am in no way affiliated to Markus Winand.

Leave a Comment