Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 6573353
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 25, 20262026-05-25T15:07:18+00:00 2026-05-25T15:07:18+00:00

The ORDER BY clause is decribed in the PostgreSQLdocumentation as: ORDER BY expression [

  • 0

The ORDER BY clause is decribed in the PostgreSQLdocumentation as:

ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...]

Can someone give me some examples how to use the USING operator? Is it possible to get an alternating order of the resultset?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-25T15:07:18+00:00Added an answer on May 25, 2026 at 3:07 pm

    A very simple example would be:

    > SELECT * FROM tab ORDER BY col USING <
    

    But this is boring, because this is nothing you can’t get with the traditional ORDER BY col ASC.

    Also the standard catalog doesn’t mention anything exciting about strange comparison functions/operators. You can get a list of them:

        > SELECT amoplefttype::regtype, amoprighttype::regtype, amopopr::regoper 
          FROM pg_am JOIN pg_amop ON pg_am.oid = pg_amop.amopmethod 
          WHERE amname = 'btree' AND amopstrategy IN (1,5);
    

    You will notice, that there are mostly < and > functions for primitive types like integer, date etc and some more for arrays and vectors and so on. None of these operators will help you to get a custom ordering.

    In most cases where custom ordering is required you can get away using something like ... ORDER BY somefunc(tablecolumn) ... where somefunc maps the values appropriately. Because that works with every database this is also the most common way. For simple things you can even write an expression instead of a custom function.

    Switching gears up

    ORDER BY ... USING makes sense in several cases:

    • The ordering is so uncommon, that the somefunc trick doesn’t work.
    • You work with a non-primitive type (like point, circle or imaginary numbers) and you don’t want to repeat yourself in your queries with strange calculations.
    • The dataset you want to sort is so large, that support by an index is desired or even required.

    I will focus on the complex datatypes: often there is more than one way to sort them in a reasonable way. A good example is point: You can “order” them by the distance to (0,0), or by x first, then by y or just by y or anything else you want.

    Of course, PostgreSQL has predefined operators for point:

        > CREATE TABLE p ( p point );
        > SELECT p <-> point(0,0) FROM p;
    

    But none of them is declared usable for ORDER BY by default (see above):

        > SELECT * FROM p ORDER BY p;
        ERROR:  could not identify an ordering operator for type point
        TIP:  Use an explicit ordering operator or modify the query.
    

    Simple operators for point are the “below” and “above” operators <^ and >^. They compare simply the y part of the point. But:

        >  SELECT * FROM p ORDER BY p USING >^;
        ERROR: operator > is not a valid ordering operator
        TIP: Ordering operators must be "<" or ">" members of __btree__ operator families.
    

    ORDER BY USING requires an operator with defined semantics: Obviously it must be a binary operator, it must accept the same type as arguments and it must return boolean. I think it must also be transitive (if a < b and b < c then a < c). There may be more requirements. But all these requirements are also necessary for proper btree-index ordering. This explains the strange error messages containing the reference to btree.

    ORDER BY USING also requires not just one operator to be defined but an operator class and an operator family. While one could implement sorting with only one operator, PostgreSQL tries to sort efficiently and minimize comparisons. Therefore, several operators are used even when you specify only one – the others must adhere to certain mathematical constraints – I’ve already mentioned transitivity, but there are more.

    Switching Gears up

    Let’s define something suitable: An operator for points which compares only the y part.

    The first step is to create a custom operator family which can be used by the btree index access method. see

        > CREATE OPERATOR FAMILY xyzfam USING btree;   -- superuser access required!
        CREATE OPERATOR FAMILY
    

    Next we must provide a comparator function which returns -1, 0, +1 when comparing two points. This function WILL be called internally!

        > CREATE FUNCTION xyz_v_cmp(p1 point, p2 point) RETURNS int 
          AS $$BEGIN RETURN btfloat8cmp(p1[1],p2[1]); END $$ LANGUAGE plpgsql;
        CREATE FUNCTION
    

    Next we define the operator class for the family. See the manual for an explanation of the numbers.

        > CREATE OPERATOR CLASS xyz_ops FOR TYPE point USING btree FAMILY xyzfam AS 
            OPERATOR 1 <^ ,
            OPERATOR 3 ?- ,
            OPERATOR 5 >^ ,
            FUNCTION 1 xyz_v_cmp(point, point) ;
        CREATE OPERATOR CLASS
    

    This step combines several operators and functions and also defines their relationship and meaning. For example OPERATOR 1 means: This is the operator for less-than tests.

    Now the operators <^ and >^ can be used in ORDER BY USING:

    > INSERT INTO p SELECT point(floor(random()*100), floor(random()*100)) FROM generate_series(1, 5);
    INSERT 0 5
    > SELECT * FROM p ORDER BY p USING >^;
        p    
    ---------
     (17,8)
     (74,57)
     (59,65)
     (0,87)
     (58,91)
    

    Voila – sorted by y.

    To sum it up: ORDER BY ... USING is an interesting look under the hood of PostgreSQL. But nothing you will require anytime soon unless you work in very specific areas of database technology.

    Another example can be found in the Postgres docs. with source code for the example here and here. This example also shows how to create the operators.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

How can I add ELSE clause to the following code? ROW_NUMBER() OVER (ORDER BY
Can I use placeholders in a prepared statement for the order by clause of
How can I make an ORDER BY clause with a small LIMIT (ie 20
I get The ORDER BY clause is invalid in views, inline functions, derived tables,
I have a complex query with group by and order by clause and I
I just found some strange behavior of database's order by clause. In string comparison,
Possible Duplicate: Ordering by the order of values in a SQL IN() clause With
Is it possible to craft an ORDER BY clause to ensure the following criteria
I'm having problem with binding a parameter in an ORDER BY clause within a
I have a query which has an Order By clause. The generated SQL from

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.