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:
Kae najgore…možda i uzmem neki max broj.
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.
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, 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š.
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 ), niti je bilo pljuvanje.
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…
Pa ti glancaj … i seri majstoru čiji je ferari mastan.
Možda jednom kada umastiš svoje ruke, nešto i naučiš.