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))