SQL Abfrage wie abändern (App Abfrage mit Parametrisierung und Wildcard)

Don-DCH

Captain
Registriert
Aug. 2009
Beiträge
3.241
Guten Mittag zusammen,

ich würde gerne auf meiner App QueryDB für das iPhone und iPad eine Abfrage mit Parametrieserung und Wildcard anlegen.
Generelle Abfragen mit Parametrisierung, dass ich nach einer Eingabe aufgefordert werde klappen super.
Allerdings benötige ich für eine andere Tabelle eine Abfrage mit Parametrisierung und Wildcard. Anbei ein Beispiel

SELECT Name FROM TABELLE1 WHERE Name Like "%franz%"

Das funktioniert super, jedoch möchte ich die Parametriesierung nutzen, dass ich nach dem Namen in diesem Falle Franz gefragt werde
(Parameter kann ich mit Doppelpunkt oder Fragezeichen angeben laut App)

Dazu meine Nicht funktionierende Ideen:
SELECT Name FROM TABELLE1 WHERE Name Like '%' + :Name + '%'
Alternativ
SELECT Name FROM TABELLE1 WHERE Name Like "%" + :Name + "%"

Was gehen würde
SELECT Name FROM TABELLE1 WHERE Name Like :Name
Das bringt mir allerdings nichts, da auch nach schlüsselworten in dem Feld gesucht werden soll, sprich nicht immer alles genau so geschrieben werden soll.
Aber mit Wildcard geht es einfach nicht.


Vielleicht stehe ich auf dem Schlauch, komme aber einfach nicht weiter, habe sämtliche Varianten getestet und google hat mich auch nur zu
SELECT Name FROM TABELLE1 WHERE Name Like '%' + :Name + '%'
gebracht, welches leider nicht klappt.
 
sikarr schrieb:
Welche App?
Welche Sprache? (ausser SQL)
Warum sind die % auskommentiert?
Was sollen die + und der : bei Name?
Sollte die Abfrage nicht eher:
SQL:
SELECT Name FROM TABELLE1 WHERE Name Like '%:Name%';
lauten?
Danke für die schnelle Antwort!

Die App heißt QueryDB
Anbei der Link zum Store, vielleicht hilft das
https://apps.apple.com/us/app/mysql...Hwo8Wgirv0FxXoexFbTDL5Ia6FrXGCU_gamGirFpXkcR8

Eine wirkliche Webseite konnte ich nicht finden nur eine Facebook Seite
https://www.facebook.com/mysqlquerydb

Soweit ich weiß nur SQL was die App direkt an den Maria DB Server absetzt.

Auskommentiert habe ich die % damit man eine zusammenhängende Query hat, da es leider nicht so klappt wie du geschrieben hast
Wenn ich SELECT Name FROM TABELLE1 WHERE Name Like '%:Name%'; schreibe, bleibt das Ergebnis leer :(

@BeBur
Hmm kannst du das Etwas ausführen, eventuell mit einem Beispiel wie ich weiter vorgehen sollte?

Viele Grüße und vilen Dank euch!
 
Warum stellst Du "Name" und "Tabelle1" in ICode-Tags und die Abfrage selber nicht?
Benutz doch SQL-Tags, damit wir Deine Queries besser lesen können.

Bei MariaDB (wie bekanntlich auch bei MySQL) wird String-Konkatenation mit der Funktion
SQL:
CONCAT()
ausgeführt (s. hier) - vielleicht kommst Du Deinem gewünschten Ergebnis damit näher.
QueryDB kenne ich nicht, falls darin das String-Konkatenieren mit "+" o.ä. implementiert sein sollte, dann weiss ich nichts davon.
 
Du musst die Wildacards mit deinem String konkatenieren.

Oracle: select * from tabelle where name like '%'||:name||'%';
w3c mysql: select * from tabelle where name like concat("%",:name,"%");
 
  • Gefällt mir
Reaktionen: Don-DCH
kaikuwe schrieb:
Du musst die Wildacards mit deinem String konkatenieren.

Oracle: select * from tabelle where name like '%'||:name||'%';
w3c mysql: select * from tabelle where name like concat("%",:name,"%");

Vielen herzlichen Dank!!
Die untere Abfrage hat funktioniert!
Die obere hat mir alles ausgegeben.

Damit ist mein Problem gelöst, nochmals vielen herzlichen Dank!
Auf diese Query wäre ich nicht gekommen.

Die Oracle Query gibt mir alles aus, aber die w3c funktioniert einwandfrei :)

Viele Grüße und vielen Dank allen :)
 
Gern.
Das ober ist Oracle Syntax ... da kann man Strings mit || konkatenieren. Funktioniert dann aber eben auch nur bei Oracle. Das untere w3c ist allgemeiner.
 
@Don-DCH - mit dem Prepared Statements - das sind Basic um die Exponierung von Daten zu vermeiden - genau deshalb arbeitet man nicht einfach so mit CONCAT auf ungeprüften INPUTS von ganz draussen

Stark vereinfacht:

'select * from tabelle where a= '+:PARAMETER;
man denkt wohlwollend an Parameter wie 'A' das dann so was rauskommt

select * from tabelle where a= 'A';

aber was wenn im Parameter 'A' or 1=1 kommt

select * from tabelle where a= 'A' or 1=1;

liefert dann alle Daten - dann laufen auch UPDATE und LÖSCH-Operationen über viel mehr Records als gewollt
 
  • Gefällt mir
Reaktionen: mental.dIseASe, BeBur und sikarr
Richtig. SQL Injection sollte man abfangen. Sonst kann da ganz schnell, ganz böses passieren.
 
Don-DCH schrieb:
Vielen herzlichen Dank!!
Die untere Abfrage hat funktioniert!
Damit gibst du btw. jedem Nutzer vollständigen Zugriff auf die Datenbank.
Wenn nur du das ganze verwendest - OK.
Wenn andere das was du da baust verwenden - nicht gut.
 
Danke für die Rückmeldungen.
Die Datenbank ist nur privat in meinem Netzwerk, ich greife mit einem eigens angelegten User darauf zu, welcher nur leserechte hat, das sollte dann soweit passen oder?

Also man muss sich mit Benutzernamen und Passwort an der Datenbank authentifzieren und für die App habe ich extra einen Benutzer eingerichtet der nur lesenden Zugriff hat.

HTTPS würde ich auch noch gerne einstellen, ist aber nicht so ganz trivial wenn die maria db auf dem synology nas läuft, das systemzertifikat wird leider nicht mitverwendet.

Ansonsten ist das ganze auch nur intern bzw. VPN erreichbar.
 
Kann man imHo nicht beurteilen, da die eingesetzten Technologien und wo/wie Authentifizierung/Authorisierung umgesetzt wird etwas unklar ist.
Generell, solange du der einzige bist, der das ganze verwendet kann man das imHo aber so machen.
 
Zurück
Oben