Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#7

AW: Array mit DB Ergebnismenge vergleichen

  Alt 15. Mai 2018, 17:10
Viele DBMS können mit Array-Parametern umgehen und es gibt DB-Zugriffskomponenten, welche das ebenfalls durchreichen können.
SQL-Code:
SELECT Name, COUNT(*) AS Anz
FROM Tabelle
WHERE Name IN :ArrayParameter
GROUP BY Name
ORDER BY Anz ASC

-- SQL.ParamByName('ArrayParameter').ArrayIrgendwas[0] := 'PAUL'; ...
-- SQL.ParamByName('ArrayParameter').ArrayIrgendwas := ['PAUL', 'KLAUS', ...];
-- SQL.ParamByName('ArrayParameter').SetArrayIrgendwas(['PAUL', 'KLAUS', ...]);
-- oder SonstWie
Leider geht das nicht überall, aber da gibt es auch einen Trick.
* den ganze SQL-String manuell zusammensetzen
* oder Makros und nur diesen einen Teil selber basteln
SQL-Code:
SELECT Name, COUNT(*) AS Anz
FROM Tabelle
WHERE Name IN (&ArrayMacro)
GROUP BY Name
ORDER BY Anz ASC

-- SQL.MacroByName('ArrayMacro').Value := 'a,b,c'; // siehe (1)
1) Ich hab das bisher vorallem mit Integern gemacht, da ist es extrem einfach über eine ArrayToString-Funktion aus dem Array [1,2,3] einen '1,2,3' String zu generieren, ohne auf das Quoting achten zu müssen.
Für Strings sollte man hier "unbedingt" die Quote-Funktion der DB-Zugriffskomponenten verwenden und damit den String erzeugen.
also sowas wie http://php.net/manual/de/function.my...ape-string.php
bzw. quote_name, quote_value, quote_literal oder z.b. TPgTextConverter.EscapeString (PgDAC).
'''PAUL'', ''KLAUS'', ...'
Delphi-Quellcode:
S := '';
for i := 0 to High(DeinArray) do begin
  if S <> 'then S := S + ', ';
  S := S + DBQuoteValueFunction(DeinArray[i]);
end;

PS: https://modern-sql.com/de/anwendung/select-ohne-from
SQL-Code:
--SELECT n
--FROM (VALUES ('Peter'), ('Klaus'), ('Paul'), ('Theo'), ('Bernd')) AS t(n)
--LEFT JOIN tabelle ON name = n
--WHERE ... weiß ich grade nix ... halt irgendwas mit count()=0 oder so

SELECT n
FROM (VALUES ('Peter'), ('Klaus'), ('Paul'), ('Theo'), ('Bernd')) AS t(n)
WHERE not exists(SELECT * FROM tabelle WHERE upper(name) = upper(n))
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (15. Mai 2018 um 17:30 Uhr)
  Mit Zitat antworten Zitat