Skip to content
Advertisement

Order By two columns but have one order

This question is sequelize specific but I’d figure if I found a way to do in SQL then I could find a way to do it in sequelize

I need for the request to be ordered back by user.fullname which is joined by using include and by mockUser.fullname which is a JSON field.

One important thing to keep in mind however is that user is nullable in the case a mockUser is present.

This is what I have so far, it is ordering by mockUser.fullname and user.fullname, However, it is doing so separately, meaning there are two correct orders but they’re not ordered into one single order which is the desired result.

      const options = {
        where: args,
        include: ['user'],
        limit,
        offset,
        order: [['user', 'fullname', 'ASC'], ['mockUser.fullname', 'ASC']]
      }

SQL equivalent-ish of the above sequelize representation, it’s spit out by sequelize but I cleaned it up

Note: it turns every “user”.”column” as “user.column”

SELECT * FROM "table" 
LEFT OUTER JOIN "user" ON "table"."userId" = "user"."id" 
WHERE "table"."columnId" = '9efcbd5a-4dc7-4102-ad59-b6f6cd9adaa4'
ORDER BY "user"."fullname" ASC, ("table"."mockUser"#>>'{fullname}') ASC 
LIMIT 10 
OFFSET 0;

I’m using table and column to obfuscate the real names

Example output:

Adam Smith -> user
Beatrice Westfield -> user
John Smith -> user
Andy Brook -> mockUser
Mario Jimenez -> mockUser
Nadia Martinez -> mockUser

Desired Output:

Adam Smith -> user
Andy Brook -> mockUser
Beatrice Westfield -> user
John Smith -> user
Mario Jimenez -> mockUser
Nadia Martinez -> mockUser

As you can see it first sorts user and then mockUser, but how could I combine both?

Advertisement

Answer

I think you are looking for

order by coalesce (user, mockUser)

in this case if user is null it will order by mockuser.

User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement