Estou no Postgres 13.5.
Os registros sempre têm um number
(tipo: integer
) e, opcionalmente, uma única letter
AZ (tipo: varchar(1)
– não char
por motivos de estrutura).
Os registros geralmente são classificados number ASC, letter ASC NULLS FIRST
. A sequência pode ter lacunas. As letras ausentes são representadas como NULL.
Por exemplo, você pode obter este pedido: 1, 1A, 1B, 2, 10, 10A, 10C
Agora, quero fazer coisas como encontrar os dois registros "à direita" de um determinado registro. Portanto, se o registro fornecido for o número 2, quero encontrar 10 e 10A no exemplo acima.
seria conveniente se eu pudesse consultar uma condição como (pseudo código):number > $given_number OR (number = $given_number AND letter > $given_letter NULLS FIRST)
Isso não funciona como está escrito, é claro. Quais são as maneiras que eu poderia conseguir isso?
Prefiro não mesclar as colunas ou adicionar novas colunas.
Soluções que consigo pensar:
- Selecione uma lista de IDs de registro no SQL, use a lógica do aplicativo fora do banco de dados para localizar IDs dos próximos dois registros e faça uma segunda consulta para localizar apenas aqueles.
- Uma condição mais longa que explica explicitamente NULLs, algo como
WHERE number > $given_number OR (number = $given_number AND (($given_letter IS NULL AND letter IS NOT NULL) OR letter > $given_letter)) ORDER BY number ASC, letter ASC NULLS FIRST LIMIT 2
- Aglutinando NULLs, algo como
WHERE number > $given_number OR (number = $given_number AND letter > COALESCE($given_letter, '')) ORDER BY number ASC, letter ASC NULLS FIRST LIMIT 2
Alguma ideia melhor? Ou alguma opinião sobre estes?