[ S A J A @ 31.10.2020. 13:28 ] @
Pozdrav svima,

Imam klasičan upit: select * from table where uslov.

Treba mi predlog kako da postavim upit tako da mi vrati sve rekorde neke tabele ako ono što sam filtrirao ne postoji. Recimo, ako kažem where opština_id=5 vrati mi one rekorde gde je opština_id=5 ali ako nema ni jednog, da mi umesto praznog rezultata vrati sve opštine.

Hteo bih nekako da izbegnem duple upite, u smislu:

if (opstina_id) {
database -> select * from opstine where id=opstina_id
} else {
database -> select * from opstine
}

Jel postoji tako nešto?
[ djoka_l @ 31.10.2020. 13:43 ] @
select * from opstine
where opstina_id = id
or not exists (select * from opstine where opstina_id = id)
[ plague @ 31.10.2020. 16:15 ] @
Ne znam sto je problem imati jedan if statement, a nije problem imati slicnu (ili cak ruzniju) konstrukciju u upitu?

Ako je u pitanju API koji ima GET /opstine i GET /opstine/{id}, nema smisla vratiti sve opstine kada se trazi po ID-u jer se tada ocekuje jedan record, a ne kolekcija.
Najezio bih se od APIa koji pokusava da misli umesto mene sta hocu.

Toliko stvari moze sutra da ti zatreba koje ce anulirati skoro sve sto si hteo positici tim upitom:

Da li moji useri traze opstina_id koji ne postoji? Da li postoji bug negde drugde (odakle im taj id)?
Kako ce upit izgledati ako se mora dodati paginacija ili neki komplikovaniji join-i?
Kako se ponasa upit kroz vreme pogotovu ako nije bas jednostavan upit?
Sta ako sutra imas frontend gde postoji lista opstina i edit dugme? Kada neko klikne edit dugme gde treba ucitati ostale podake, a opstina je u medjuvremenu izbrisana, vratices sve recorde?
[ S A J A @ 31.10.2020. 17:32 ] @
Da, sve stoji. Biće ipak da ću morati u backendu da pripremim upit. Mislio sam da možda SQL nema neku foru da se to uradi preko jednog upita (a da nije ovako ko što je Đoka napisao).

Ovde se radi o vraćanju liste nečega što može biti predmet restrikcije. Recimo, ako korisnik ima ogrančenje da vidi samo 3 opštine, vrati samo 3 opštine, ako nema ograničenje, onda vrati sve. Zato mi trebaju dva upita jedan bez where i drugi sa where ali sam mislio da mogu da prođem sa jednim.

Malo sam guglao i izgleda da može da se napravi kondicionalni where, otprilike ovako:

SELECT * FROM opstine
WHERE
CASE
WHEN !ISNULL(?) THEN opstine_id IN(?)
ELSE 1 = 1
END

Ovo mi već izgleda solidno upotrebljivo. Dakle, ako korisnik nema ograničenja, dobiće ceo spisak (parametar će biti null). Ako ima ograničenja koje opštine može da vidi, to će biti niz i upit će vratiti samo njih.