Databáze > MySQL

MySQL a příkaz SELECT

(1/4) > >>

Vladimir64:
Zase jsem se zasekl. Na formuláři mám 6 ComboBoxů, ve kterých jsou načteny jedinečné hodnoty ze šesti různých sloupců tabulky. Tyto ComboBoxy slouží k filtrování záznamů tabulky. Potřebuji, aby příkaz SELECT za klauzulí WHERE vyfiltroval záznamy podle hodnot v ComboBoxech. Příkazy:

 DataModule1.MySQLQuery.SQL.Clear;
 DataModule1.MySQLQuery.SQL.Add('SELECT * FROM results WHERE competition = :someValue AND class >= :someValue1 AND class <= :someValue2 AND round <= :someValue3 AND hometeam = :someValue4 AND awayteam = :someValue5');
 DataModule1.MySQLQuery.Params[0].AsString := MainForm.ComboBox1.Items[MainForm.ComboBox1.ItemIndex];
 DataModule1.MySQLQuery.Params[1].AsString := MainForm.ComboBox2.Items[MainForm.ComboBox2.ItemIndex];
 DataModule1.MySQLQuery.Params[2].AsString := MainForm.ComboBox6.Items[MainForm.ComboBox6.ItemIndex];
 DataModule1.MySQLQuery.Params[3].AsString := MainForm.ComboBox3.Items[MainForm.ComboBox3.ItemIndex];
 DataModule1.MySQLQuery.Params[4].AsString := MainForm.ComboBox4.Items[MainForm.ComboBox4.ItemIndex];
 DataModule1.MySQLQuery.Params[5].AsString := MainForm.ComboBox5.Items[MainForm.ComboBox5.ItemIndex];
 DataModule1.MySQLQuery.Open;

funguje pouze pokud jsou zadané hodnoty ve všech ComboBoxech. Já ale potřebuji filtrovat záznamy i když některé ComboBoxy zůstanou prázdné. Prostě pokud zvolím hodnotu pouze v jednom ComboBoxu, tak se vyfiltrují záznamy jen podle tohoto jediného kritéria, pokud ve dvou, tak se vyfiltrují záznamy podle dvou kritérií atd.
Nemůžu na to přijít, už jsem vyzkoušel složené SQL příkazy, podmínky vložené do SQL příkazu, podmínky při přiřazování hodnot do MySQLQuery.Params, zástupné symboly a nic nefunguje správně. Poradí někdo?

vandrovnik:
No jestli dobře chápu požadavek, tak stačí do WHERE prostě dát jen ty podmínky, které mne zajímají, ne?
Tj. tu část WHERE bych si sestavil programově a do SQL dotazu tu podmínku zapisoval. A až pak nastavil hodnotu parametrů.

Vladimir64:
ano, ale 6 ComboBoxů (podmínek) je celkem 53 možností. Prostě ze 6 podmínek lze vytvořit jednu šestici, šest pětic, deset čtveřic, dvacet trojic, deset dvojic a šest jednotlivých podmínek. Myslel jsem, že existuje snazší způsob než udělat například 53 "case" podmínek.
Ledaže... myslíš vytvořit řetězec podle toho který ComboBox udává podmínku k třídění? A potom celý tento string vložit za WHERE?

vandrovnik:
Spíš něco jako:


--- Kód: ---procedure PridejPodminku(var Podminka: string; const NovaPodminka: string);
 begin
 if NovaPodminka<>'' then begin
  if Podminka<>'' then Podminka:=Podminka+'and';
  Podminka:=Podminka+'('+NovaPodminka+')';
 end;
end;

...

Podminka:='';
if ComboBox1.ItemIndex>=0 then PridejPodminku(Podminka, 'Pole1=:Hodnota1');
if ComboBox2.ItemIndex>=0 then PridejPodminku(Podminka, 'Pole2>=:Hodnota2');
...
DataModule1.MySQLQuery.SQL.Clear;
DataModule1.MySQLQuery.SQL.Add('SELECT * FROM results');
if Podminka<>'' then begin
 DataModule1.MySQLQuery.SQL.Add('WHERE '+Podminka);
 if ComboBox1.ItemIndex>=0
  then DataModule1.MySQLQuery.ParamByName('Pole1').AsString := ComboBox1.Items[ComboBox1.ItemIndex];
 ...
end;

--- Konec kódu ---

Jan Fiala:
Mohl bys to udělat i bez dynamického generování WHERE, ale moc optimální by ten dotaz nebyl. Něco jako:


--- Kód: ---SELECT *
  FROM results
  WHERE competition = case when :someValue ='' then competition else :someValue end  AND
      class >= case when :someValue1 = '' then class else :someValue1 end AND
      class <= case when :someValue2 = '' then class else :someValue2 end AND
      ...
--- Konec kódu ---

Nezkousel jsem, zda to nebude zdvojovat parametry.

Navigace

[0] Seznam témat

[#] Další strana

Přejít na plnou verzi