Ranges

PRQL has a concise range syntax start..end. If only one of start & end are supplied, the range is open on the empty side.

Ranges can be used in filters with the in function, with any type of literal, including dates:

PRQL

  1. from events
  2. filter (created_at | in @1776-07-04..@1787-09-17)
  3. filter (magnitude | in 50..100)
  4. derive is_northern = (latitude | in 0..)

SQL

  1. SELECT
  2. *,
  3. latitude >= 0 AS is_northern
  4. FROM
  5. events
  6. WHERE
  7. created_at BETWEEN DATE '1776-07-04' AND DATE '1787-09-17'
  8. AND magnitude BETWEEN 50 AND 100

Like in SQL, ranges are inclusive.

As discussed in the take docs, ranges can also be used in take:

PRQL

  1. from orders
  2. sort [-value, created_at]
  3. take 101..110

SQL

  1. SELECT
  2. *
  3. FROM
  4. orders
  5. ORDER BY
  6. value DESC,
  7. created_at
  8. LIMIT
  9. 10 OFFSET 100

Note

Half-open ranges are generally less intuitive to read than a simple >= or <= operator.

Roadmap

We’d like to use ranges for other types, such as whether an object is in an array or list literal.