Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Vrati sve ako nema ništa

[es] :: MySQL :: Vrati sve ako nema ništa

[ Pregleda: 1118 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

S A J A
Beograd

Član broj: 226539
Poruke: 1904
*.static.sbb.rs.



+421 Profil

icon Vrati sve ako nema ništa31.10.2020. u 13:28 - pre 41 meseci
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?
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3445

Jabber: djoka_l


+1462 Profil

icon Re: Vrati sve ako nema ništa31.10.2020. u 13:43 - pre 41 meseci
select * from opstine
where opstina_id = id
or not exists (select * from opstine where opstina_id = id)
 
Odgovor na temu

plague
Software Developer
Auckland, NZ

Član broj: 46734
Poruke: 623
*.vocus.co.nz. via ipv6



+373 Profil

icon Re: Vrati sve ako nema ništa31.10.2020. u 16:15 - pre 41 meseci
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?
 
Odgovor na temu

S A J A
Beograd

Član broj: 226539
Poruke: 1904
*.static.sbb.rs.



+421 Profil

icon Re: Vrati sve ako nema ništa31.10.2020. u 17:32 - pre 41 meseci
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.
 
Odgovor na temu

[es] :: MySQL :: Vrati sve ako nema ništa

[ Pregleda: 1118 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.