Databáze > MySQL
MySQL a příkaz SELECT
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