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.