SQL provjera jel nešto je ili nije u praznoj listi

Pozdrav,

imam binder koji sljedeći query:

SELECT * FROM table WHERE x in @ids

konvertira u
SELECT * FROM table WHERE x in ('1','2','3')

za x = [1,2,3];

Problem nastaje ako je x prazna lista, jer onda bi bindani queryi izgledao:
SELECT * FROM table WHERE x in () …što je sintatički neispravno i takav poziv baca grešku.

Kako bi to izbjegao, binder automatski prepoznaje parametar da je prazna lista i u tom slučaju napravi ovo: $x=[0];
Nula je ubačena pod pretpostavkom da su x uglavnom nekakvi ID-evi i da nikada nisu nula.
No to je bilo glupo i opravdano sam naletio na minu. …našao se neki podatak koji je bio upravo NULA i bogme me ovaj bug dobro izmučio dok nisam skužio koji vrag se dešava …

Stoga pitanje je kako napisati ispravno SQL query sa praznom listom u uvjetu? Kako se nebi raspala provjera jel nešto JE ili NIJE u praznoj listi.

Znam da je jedan od ta dva uvijeta uvijek false, drugi uvijek true … i da ih ručno nikada nebi takve napisali … ali htio bih na razini bindera to riješiti da ne moram kod bindanja mijenjati logiku querya više nego je potrebno…

Hoćem reći, s čime zamjeniti samo boldani dio da query ostane ispravno napisan:

SELECT * FROM table WHERE x in ()

Hvala.

Sa nekom selektom koji ce uvijek vratiti prazan rezultat.

Reci binderu da u tom slučaju stavi $x=[1000000000000000000000000000000000000000000000000000000000000000000000000]

:joy:

1 Like

Liste sam uvijek spremao u temp tablice. Ako imaju puno podataka obavezno index.

Vrhunsko rješenje :+1:

@bozoou možda da probaš sa JOIN.

Što bi sa JOIN-om točno napravio?

Kae najgore…možda i uzmem neki max broj. :slight_smile:
Probao sam sa stringom nekakvim koji bi bio nemoguć za ponovit, ali ako je polje INT type…onda se taj string casta u broj i dobije se opet nula, heh …pa ostaje isti problem.

Ovo zvuči dobro…samo je malo glupo što bi taj selekt onda ovisio od aplikacije do aplikacije, a ne može biti neki univerzalni. Hmm …ili bi možda mogao?

Hmm…nisam baš siguran da odgovara na moje pitanje…tj. nisam siguran da temp tablice uvijek upotpunjuju gornju potrebu. Mada nisam u tom smjeru razmišljao i malo mi je mutno na što točno misliš.

Ako sam dobro shvatio, nekakav set podataka držiš u temp tablici i onda kod provjere jel nešto u tom setu, radiš tipa “... where x in (Select id from tempTable where set='neki_set')” …tako nešto si mislio?

To mi se čini ocke ako imaš nekakve standarne setove podataka u kojima gledaš jel se nešto nalazi …ali ako set nastaje po onome što je user maloprije isklikao/odabrao, onda bi to bio dupli posao prvo unositi taj set u tempTablicu, pa onda raditi select po tom setu.

Al nisam siguran da sam te dobro skužio…

Ne, temp tablice joinam.
Priznajem da ima posla dok napuniš tablice, ali u nekim slučajevima se isplati.

MySql ima neku dummy tablicu “dual”
tako da bi taj query izgledao :
SELECT * FROM tables WHERE x in (select 1 from dual where false)

No ovdje su jos neka rjesenja koja mozda rade na raznim DB

1 Like

Znao sam da će ti odgovarati moje briljantno rješenje :smiley:

Odlicno. :wink:

Joinao :joy:

Al da ti ipak odgovorim, ali u tvom stilu.

Iskreno, očekivao sam puno bolje odgovore na ovu temu, al ono šta se nudi je zafrkancija i nerazumijevanje. Tužno je šta će na kraju jedno od toga biti prihvaćeno rješenje.

Haha, stvarno? :joy: :joy: :joy:

Inače, postoji PHP_INT_MAX constanta.

Ne kažem da to koristiš, samo ukazujem na njeno postojanje :smiley:

Očekivao sam da će to riješenje zabolit nekoga tko nema smisla i tko u najmanju ruku nije shvatio kakav problem se riješava.

Ako imaš elegantnije riješenje, slobodan si ga ponudit. U suprotnom mlatiš po praznoj slami ko i inače…

Opa, zamijenili smo uloge? Ovako nešto bi ja napisao, a moj prethodni post izgleda kao nešto šta bi ti napisao. :joy:

Imam, ali baš mi je ovo zanimljivo…

Haha, tebe muči što ti je tamo odgovor izostao pa si došao ovdje kmečat. To ti je zbog stava s kojim pristupaš na teme, popljuvat i vrijeđat izvisoka i još bi da ti se crta ono što ne razumiješ. :slight_smile:

A i generalno sam ostavio ono još neko vrijeme namjerno sakrivenim, jer nisam trenutno siguran jel ta ideja vrijedna čuvanja.

Loše, i opet loše. To šta si ti egomanijak i ne znaš primiti kritiku, to je tvoj problem. Nije to pljuvanje, to i juniori nauče vrlo brzo. Tvoj problem je puno dublji od toga…

Najgora vrsta ljudi koje sam do sada upoznao su upravo takvi kao ti, šta misle da sve znaju, a ne znaju. Moje ponašanje je odgovor na tvoje ponašanje, al definitivno nije bilo s visoka ( možda malkoc :relaxed: ), niti je bilo pljuvanje.

Kme, kme, kme…
:joy:

Ja uvijek kažem od kritike se živi, ne od hvale. Svakako cijenim kritiku, ali opravdanu… koju znaš i možeš elaborirati ako ti se postavi kontra pitanje.

To što si ti išao moj code sprdati zbog usporenja od 0.0000000002 sec … a onda nisi znao pojasniti gdje i kome je to bitno? To je tvoj problem.

Možda sada i shvatiš analogiju sa glancanjem ferarija da se sjaji kako bi isti ubrzao 0.00000002 sekunde, dok netko drugi ima skroz masnog i prljavog ferarija…jer svako malo prekopa sve ispod haube… ali zato kad nešto inovira ispod te haube, satare onog što samo glanca. Ti samo glancaj da ti se program izvrši brže za 0.0000002 sec, a ja ću kopirat 100GB za manje vremena od toga što ćeš ti glancanjem uštediti… :stuck_out_tongue:
Pa ti glancaj … i seri majstoru čiji je ferari mastan. :wink:

Možda jednom kada umastiš svoje ruke, nešto i naučiš.