Postgresql Jak sprawic by wynik byl wyswietlany wedlug 2 pol

0

Mam na przyklad takie zapytanie
SELECT id,status,add_date,name FROM tabela

jak slrawic zeby wyniki wyswietlaly sie wzgledem pola ID ale zeby te od samej gory byly ze statusem = 3
czyli w pierwszej kolejnosci tam gdzie status 3 a niezj zeby bylo po id

0

Tzn chciałbyś zrobić tak że pierwsze są te z status = 3, a pod nimi są rekordy posortowane pod ID? Nie ma takiej opcji. Albo sortujesz calość, albo wcale.
Możesz zrobic tak żeby dane były posortowane po statusie malejąco i po ID rosnąco, wtedy będziesz miał coś takiego:

ID status
2 3
4 3
1 2
3 1

SELECT id, status, add_date, name 
FROM tabela
ORDER BY status desc, id
0

standardowo nie ma..
ale można np dodać nowe pole:

np tak (nie wiem czy posgre decode obsluguje)

SELECT id,status,add_date,name
FROM tabela
order by decode(status, 3, 0, 1), id

albo złączenie z ekstra polem:

select id,status,add_date,name from 
(
SELECT id,status,add_date,name, 0 as porzadek
FROM tabela
WHERE status=3
union
SELECT id,status,add_date,name, 1 as porzadek
FROM tabela
WHERE status<>3
) order by porzadek, id

oczywiście jeśli 3 jest maksymalnym statusem to lepiej rozwiązanie Shaloma zastosować

0

W przypadku dużej bazy danych trzeba zrobić indeksy na polach wymienionych w części "order by". Jeśli porządkujemy malejąco na jakimś polu, to indeks też trzeba utworzyć malejący.

0

Rozwiazanie @void-tec daje co prawda poprawny wynik, ale kosztem dodatkowego zapytania, trzeba mieć to na uwadze ;) Poza tym czy mi się wydaje czy zupełnie niepotrzebnie są tam 3 zamiast 2 zapytań?
Czy to nie będzie miało takiego samego efektu jak:

SELECT id,status,add_date,name
FROM tabela
WHERE status=3
union
SELECT id,status,add_date,name
FROM tabela
WHERE status<>3
ORDER BY id

?

0

@Shalom można usunąć trzecie zapytanie, ale Twój sposób sortuje i tak elementy po id,
natomiast mała modyfikacja krzyczy błędem, że polecenie źle zakończone :

SELECT id,status,add_date,name
FROM tabela
WHERE status=3
ORDER BY id
union
SELECT id,status,add_date,name,
FROM tabela
WHERE status<>3
ORDER BY id

trzeba więc dodac te ekstra pole:

SELECT id,status,add_date,name,0 porzadek
FROM tabela
WHERE status=3
union
SELECT id,status,add_date,name,1 porzadek
FROM tabela
WHERE status<>3
ORDER BY porzadek,id
0

Witam
Zrobilem na tej zasadzie jak pisaliscie:

SELECT id,status,add_date,name,0 AS ordering
FROM tabela
WHERE status=2
union
SELECT id,status,add_date,name,1 AS ordering
FROM tabela
WHERE status=1
ORDER BY ordering,id

testowalem rozne konfiguracje, decode funkcji w postgresie pisalo ze nie ma ale w oraclu pewnie
tam jest. W kazdym razie kosztem dwoch zapytan. Dodatkowo zalozylem indexy na pole ID maxymalnie
bedzie to jednorazowo do 150 max 200 rekordow. Dziekuje za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1