Autor Zpráva
final
Profil
zdravím,
potreboval by som pridať nejak podmienku do tohoto
$premenna = 1;
$result = dibi::query("
  select jedna, dva from tabulka where stlpec=(
    if (jedna='$premenna'){
      dva
    }
    else{
      jedna
     }
  )
");
niečo na taký spôsob

ďakujem
Kcko
Profil
final:
Podívej se do examples které jsou součastí dibi, lze to, přímo v SQL
Camo
Profil
final:
Na toto použi funkciu if()

Inak by ma zaujímalo, či sa to dá napísať cez if then else v tej where podmienke. Mne to teda nešlo....
Tori
Profil
Pokud všechny výskyty jedna, resp. dva označují tentýž sloupec (tj. aliasy místo skutečného názvu sloupce), pak se to přeci dá zapsat obyčejnou podmínkou:
SELECT sloupce FROM tabulka
WHERE jedna = '$promenna' AND sloupec = dva
OR sloupec = jedna
Camo
Profil
Tori:
To je čistá práca, treba uznať,
ale s tou if funkciou sa to lepšie číta:
select jedna, dva, tri from tb where tri = if(tri=x, dva, jedna);
Tori
Profil
Camo:
A nezkoušel jste, jaké by na tom bylo využití indexů? Docela by mě to zajímalo, jak si s tím IF MySQL poradí.
Tori
Profil
Tak jsem to zkoušela na vzorku 4500 řádků, tři sloupce náhodných čísel v rozmezí 0-2000, podmínce vyhovují 4 řádky. Při dotazu podle [#4] explain píše, že by se mohly použít některé indexy (jedna+sloupec+dva nebo jedna+sloupec), ale nepoužily se. U verze podle [#5] indexy možné nenavrhuje, nicméně tento dotaz byl o zlomek rychlejší (největší rozdíl krajních hodnot asi 1.5ms).

Nicméně přišla jsem na to, že ty dva zápisy nejsou ekvivalentní: Dotaz s podmínkou podle [#1] nenajde řádky, kde tri == jedna && jedna = '$promenna'. Aby byly ekviv., musela by se podmínka otočit: select jedna, dva, tri from tb where if (tri = dva, jedna = '$promenna', tri = jedna) - ale co do čitelnosti nic moc. Explain ani rychlost se tím nemění.

edit: Z těch méně čitelných způsobů se totéž dá napsat i takto, ale je to z těch tří možností nejpomalejší:
select jedna, dva, tri from tb
where (tri, jedna) in ((tri, tri), (dva, '$promenna'))
↓ Není zač, je to dobrá zábava. :-)
Camo
Profil
Tori:
No pomýlil som sa tam. Miesto tri má byť v podmienke jedna:
select jedna, dva, tri from tb where tri = if(jedna=x, dva, jedna);
Na tie testy už nemám silu dnes, díky za námahu, tiež ma to zaujímalo.
final
Profil
ďakujem všetkým :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0