Databáze > MySQL

MySQL a příkaz SELECT

<< < (2/4) > >>

Vladimir64:
díky, to je ono:

procedure TMainForm.ComboBoxChange(Sender: TObject);
begin
 Podminka := '';
 if ComboBox1.ItemIndex >= 0 then PridejPodminku(Podminka, 'competition = :Hodnota1');
 if ComboBox2.ItemIndex >= 0 then PridejPodminku(Podminka, 'class >= :Hodnota2');
 if ComboBox6.ItemIndex >= 0 then PridejPodminku(Podminka, 'class <= :Hodnota3');
 if ComboBox3.ItemIndex >= 0 then PridejPodminku(Podminka, 'round <= :Hodnota4');
 if ComboBox4.ItemIndex >= 0 then PridejPodminku(Podminka, 'hometeam = :Hodnota5');
 if ComboBox5.ItemIndex >= 0 then PridejPodminku(Podminka, 'awayteam = :Hodnota6');
 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('Hodnota1').AsString := ComboBox1.Items[ComboBox1.ItemIndex];
    if ComboBox2.ItemIndex >= 0 then
        DataModule1.MySQLQuery.ParamByName('Hodnota2').AsString := ComboBox2.Items[ComboBox2.ItemIndex];
    if ComboBox6.ItemIndex >= 0 then
        DataModule1.MySQLQuery.ParamByName('Hodnota3').AsString := ComboBox6.Items[ComboBox6.ItemIndex];
    if ComboBox3.ItemIndex >= 0 then
        DataModule1.MySQLQuery.ParamByName('Hodnota4').AsString := ComboBox3.Items[ComboBox3.ItemIndex];
    if ComboBox4.ItemIndex >= 0 then
        DataModule1.MySQLQuery.ParamByName('Hodnota5').AsString := ComboBox4.Items[ComboBox4.ItemIndex];
    if ComboBox5.ItemIndex >= 0 then
        DataModule1.MySQLQuery.ParamByName('Hodnota6').AsString := ComboBox5.Items[ComboBox5.ItemIndex];
 end;
 DataModule1.MySQLQuery.Open;
 end;

procedure TMainForm.PridejPodminku(var Podminka: string; const NovaPodminka: string);
 begin
 if NovaPodminka <> '' then begin
    if Podminka <> '' then Podminka := Podminka + ' and ';
    Podminka := Podminka + '(' + NovaPodminka +')';
 end;
end;

Jak jednoduché, všechna čest. Děkuji

Vladimir64:

--- Citace: Jan Fiala  31-12-2022, 23:18:49 ---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.

--- Konce citace ---

Podobně složené SELECT příkazy jsem zkoušel nesčetněkrát. Bez výsledku (což neznamená, že to nejde). Líbí se mi ale elegantní řešení viz. výše. Přesto děkuji za reakci.

Jan Fiala:
Když už přidáváš podmínky a skládáš select, pak to můžeš udělat v jednom kroku tak, že tam pošleš rovnou hodnotu v apostrofech, nemusíš přidávat parametry  a pak je plnit


--- Kód: --- if ComboBox1.ItemIndex >= 0 then PridejPodminku(Podminka, 'competition = ', ComboBox1.Text);
 if ComboBox2.ItemIndex >= 0 then PridejPodminku(Podminka, 'class >= ', ComboBox2.Text);
...
procedure TMainForm.PridejPodminku(var Podminka: string; const NovaPodminka, Hodnota: string);
 begin
 if NovaPodminka <> '' then begin
    if Podminka <> '' then Podminka := Podminka + ' and ';
    Podminka := Podminka + '(' + NovaPodminka + QuotedString(Hodnota) + ')';
 end;
end;

--- Konec kódu ---

pf1957:

--- Citace: Jan Fiala  04-01-2023, 10:57:46 ---Když už přidáváš podmínky a skládáš select, pak to můžeš udělat v jednom kroku tak, že tam pošleš rovnou hodnotu v apostrofech, nemusíš přidávat parametry  a pak je plnit

--- Konce citace ---
Taky se ta podminka da zapsat jako

--- Kód: SQL ---WHERE (1=1) a pak jen pridavat podminky, treba

--- Kód: SQL ---AND NovaPodminka 

vandrovnik:

--- Citace: Jan Fiala  04-01-2023, 10:57:46 ---Když už přidáváš podmínky a skládáš select, pak to můžeš udělat v jednom kroku tak, že tam pošleš rovnou hodnotu v apostrofech, nemusíš přidávat parametry  a pak je plnit
--- Konce citace ---

Parametry mi připadají lepší, protože nemusí řešit, jestli se náhodou uživatel nepokouší o nějaké SQL injection, jestli nehledá apostrof, jestli nejsou na vstupu znaky, které tenhle SQL server vyhodnocuje nějak speciálně apod.

Navigace

[0] Seznam témat

[#] Další strana

[*] Předchozí strana

Přejít na plnou verzi