SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von Stephan »

Hallo,

das hier ist leicht:

SELECT * FROM "Adressen" WHERE ( "Vorname" LIKE '%#' )

Nun suche ich Dasselbe, aber das # soll ein * (Stern) sein, welcher nicht als Platzhalter ausgewertert wird, sondern als Teil des Textes in Vorname.


Gruß
Stephan
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von RobertG »

Hallo Stephan,

da wirst Du wohl auf die direkte SQL-Ausführung umklicken müssen, denn das Sternchen wird durch die GUI in "beliebiges Zeichen" umgewandelt.

Gruß

Robert
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von F3K Total »

Guten Morgen Stephan,
wenn das Sternchen immer am Ende steht, sollte auch folgendes funktionieren:

Code: Alles auswählen

SELECT * FROM "Adressen" WHERE RIGHT( "Vorname",1) = '*'
Gruß R
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von Stephan »

RobertG hat geschrieben: Fr, 23.07.2021 18:22 Hallo Stephan,

da wirst Du wohl auf die direkte SQL-Ausführung umklicken müssen, denn das Sternchen wird durch die GUI in "beliebiges Zeichen" umgewandelt.

Gruß

Robert
Hallo Robert,
sofern das den Weg über Extras-SQL.... meint, hatte ich das bereits (erfolglos) versucht. Im Übrigen willich das SQL ohnehin in einem Makro einsetzen.

Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von Stephan »

F3K Total hat geschrieben: Sa, 24.07.2021 08:56 Guten Morgen Stephan,
wenn das Sternchen immer am Ende steht, sollte auch folgendes funktionieren:

Code: Alles auswählen

SELECT * FROM "Adressen" WHERE RIGHT( "Vorname",1) = '*'
Gruß R
Hallo F3K Total,

DAnke, das funktioniert einwandfrei.


Gruß
Stephan
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von RobertG »

Hallo Stephan,
Stephan hat geschrieben: Sa, 24.07.2021 09:09 sofern das den Weg über Extras-SQL.... meint, hatte ich das bereits (erfolglos) versucht. Im Übrigen willich das SQL ohnehin in einem Makro einsetzen.
Nein: Entwurfsansicht in der Abfrage ausschalten und dann "SQL-Befehl direkt ausführen" wählen. Ist schon merkwürdig: In der Abfrageansicht funktioniert das, über Extras → SQL nicht.

Und so funktioniert es lt. Handbuch:

Code: Alles auswählen

LIKE '%\*%' ESCAPE '\'
Das geht sogar in der GUI und eben an jeder Stelle des Wortes.

Gruß

Robert
F3K Total
********
Beiträge: 3704
Registriert: Mo, 28.02.2011 17:49

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von F3K Total »

Hallo Robert

Code: Alles auswählen

LIKE '%\*%' ESCAPE '\'
Genial!
Gruß R
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von Stephan »

RobertG hat geschrieben: Sa, 24.07.2021 09:27 Und so funktioniert es lt. Handbuch:

Code: Alles auswählen

LIKE '%\*%' ESCAPE '\'
Das geht sogar in der GUI und eben an jeder Stelle des Wortes.

Gruß

Robert
Hallo Robert,

ich hatte es bereits selbst mit:

Code: Alles auswählen

SELECT * FROM "Adressen" WHERE "Vorname" LIKE '%\*'
probiert und aber ich wäre nie auf die Idee gekommen das ich "\" etra als ESCAPE-Zeichen festlegen muss.

Gleichzeitig kann ich nur "WOW" sagen, denn selbst letztere Info steht in Deinem Base-Handbuch, denn dort schreibst Du: " Es gibt kein Standard-Zeichen zur Maskierung (Escape-Zeichen)."


Eine Frage/Anmerkung muss ich jetzt aber loswerden:
ist es nicht sehr überraschend das "\" nicht zumindest als Default-Escape-Zeichen gilt?


Gruß
Stephan
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von RobertG »

Hallo Stephan,

ich bin damals auch bloß stur die entsprechenden Seiten zu HSQLDB 1.8 durchgegangen und habe das ins Deutsche übertragen. Ich hätte allerdings auch ein Default-Escape-Zeichen erwartet. Dass die GUI damit weiterhin klar kommt zeigt, dass eben auch die Entwickler der GUI nah an der HSQLDB entwickelt haben. Bei MySQL z.B. ist das Escapezeichen auf einen Backslash festgeschrieben.
Aber so ganz einig ist sich die Welt da ja nicht. Schau einfach bei den Makros nach. Da musst Du ein doppeltes Anführungszeichen oben mit einem ebensolchen Anführungszeichen "Escapen".

Gruß

Robert
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von Stephan »

Hallo Robert,

ich muss jetzt den Thread verlängern.
Bei MySQL z.B. ist das Escapezeichen auf einen Backslash festgeschrieben.
mmh... ich habe hier jetzt eine MYSQL-DB, per ODBC an LO angebunden, getestet und erhalte

(a)
ein leeres Ergebnis bei einer Abfrage mit:

Code: Alles auswählen

SELECT * FROM `Firma` WHERE `Firmenname` LIKE '%\%'
(Base hat das selbstständig von '%\*' auf '%\%' geändert)

(b)
eine Fehlermeldung bei einer Abfrage mit:

Code: Alles auswählen

SELECT * FROM `Firma` WHERE `Firmenname` LIKE '%\*' ESCAPE '\'
SQL-Status: 42000
Fehlercode: 1064

[MySQL][ODBC 8.0(w) Driver][mysqld-5.6.30]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''\'' at line 1


(c)
einen sofortigen Absturz von Base wenn ich Extras-SQL... verwende:

Code: Alles auswählen

SELECT * FROM `Firma` WHERE `Firmenname` LIKE '%\*'
Gleiches bei:

Code: Alles auswählen

SELECT * FROM Firma WHERE Firmenname LIKE '%\*'
SELECT * FROM "Firma" WHERE "Firmenname" LIKE '%\*'

Gruß
Stephan
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von Stephan »

Ich habe das jetzt auch als Makro ausprobiert. Das hier geht:

Code: Alles auswählen

DBContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
	DBSource = DBContext.getByName("awt-mysql3")
	DBCon = DBSource.getConnection("root", "123")
	SQL_string = "Select * FROM `Firma` WHERE `Firmenname` LIKE '%#'" 
	DBStatement = DBCon.createStatement()
	DBStatement.ResultSetType = 1005
	ResultSet = DBStatement.executeQuery(SQL_string)
	cona = ResultSet.Columns.ElementNames
	
	ResultSet.first
	
	Msgbox ResultSet.getString(2)
Das hier geht nicht:

Code: Alles auswählen

DBContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
	DBSource = DBContext.getByName("awt-mysql3")
	DBCon = DBSource.getConnection("root", "123")
	SQL_string = "Select * FROM `Firma` WHERE `Firmenname` LIKE '%\*'" 
	DBStatement = DBCon.createStatement()
	DBStatement.ResultSetType = 1005
	ResultSet = DBStatement.executeQuery(SQL_string)
	cona = ResultSet.Columns.ElementNames
	
	ResultSet.first
	
	Msgbox ResultSet.getString(2)
weil das Resultsetz leer ist, was ich überprüfen kann mit z.B.:

Msgbox Resultset.Row

was -1 liefert


Gruß
Stephan
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von RobertG »

Hallo Stephan,

das Escape-Zeichen gilt nur für die Zeichen, die als Wildcard-Zeichen vertreten sind. Und das sind nur % und _, nicht aber *. Ich weiß nicht, weshalb auch bei der MariaDB nur die direkte SQL-Ausführung der Abfrage hier korrekt reagiert.

Und jetzt kommt der Geck:

Code: Alles auswählen

SELECT * FROM `Firma` WHERE `Firmenname` LIKE '%$*%' ESCAPE '$'
funktioniert anscheinend wieder.

Ich gehe davon aus, dass Base da irgendetwas intern quer verarbeitet. Hinter ESCAPE darf so bei der MariaDB nur ein Zeichen stehen, das nicht dem ursprünglichen Escape-Zeichen entspricht.

Nehme ich stattdessen bei mir den Weg über PHPMyAdmin, dann funktioniert einfach '%*%' wie gewünscht, da eben das Sternchen kein Wildcardzeichen in diesem Zusammenhang ist.

Am meisten Sorge von der Programmgestaltung her macht mir hier Extras → SQL. Von dem sollte ja erwartet werden, dass der Code nicht irgendwo noch umgeändert wird, bevor er zur Datenbank läuft - so wie eben bei einer Abfrage, die in direktem SQL ausgeführt wird. Und genau wie Extras → SQL verhält sich hier die Makroanbindung.

Gruß

Robert
Stephan
********
Beiträge: 12369
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von Stephan »

Hallo Robert,

danke für Deine Hilfe und Kommentare.

Die Situation bei der Datenbank-Anwendungsprogrammierung mit Base finde ich insgesamt sehr ernüchternd. Detailproblem reiht sich an Detailproblem ...



Gruß
Stephan
RobertG
********
Beiträge: 2033
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: SQL - SELECT alle Datensätze mit "*" (als Zeichen!) am Ende des Inhalts einer Datenspalte

Beitrag von RobertG »

Hallo Stephan,

ich habe da jetzt noch einmal mit ein Bugmeldung etwas nachgebohrt. Hier der Weg, der in Makros bereits geht. Habe ich so für das zukünfige Handbuch übernommen.
SQL-Befehle, die so abgesandt werden, entsprechen nicht genau dem, was z. B. bei den Abfragen über direkte SQL-Ausführung erreicht wird. Eine Abfrage wie

Code: Alles auswählen

… "Name" LIKE '%*%'
gibt nicht nur die Namen mit einem '*' wieder, da intern aus dem '*' ein '%' erstellt wird.
Um wirklich das gleiche Verhalten mit direkter SQL-Ausführung zu erhalten, muss

Code: Alles auswählen

oSQL_Statement.EscapeProcessing = False
nach der Erstellung von oSQL_Statement und vor der Ausführung des Codes eingefügt werden:

Code: Alles auswählen

oSQL_Statement = oConnection.createStatement()
oSQL_Statement.EscapeProcessing = False
Mal sehen, ob wir ein entsprechendes Auswahlfeld in Extras → SQL eingebaut bekommen. Auch dort läuft nämlich dieses "ESCAPING", so dass eben die Ergebnisse nicht identisch sind.

Gruß

Robert
Antworten