like in SQL
Jürgen
- datenbank
0 dedlfix0 Alexander (HH)0 dedlfix
Hallo,
ich möchte per like eine Spalte in der DB abfragen (noch Access, bald SQL Server). In der Spalte steht ein relativer Pfad, z.B.: '/_kunde/grundlagen/dtErberhard'.
Ist folgendes sinnvoll und valide:
like '/_kunde/grundlagen/dt%'
Der Unterstrich ist ein reserviertes Zeichen, oder? Wenn ich mehrere %-Zeichen angebe, was macht das für einen Unterschied?
Jürgen
Hi!
Ist folgendes sinnvoll und valide:
like '/_kunde/grundlagen/dt%'
Für welche Aufgabenstellung genau?
Der Unterstrich ist ein reserviertes Zeichen, oder?
Bei LIKE steht er für ein einzelnes beliebiges Zeichen. Wenn er für sich selbst stehen soll, musst du ihn maskieren. Das wäre beim % genauso.
Wenn ich mehrere %-Zeichen angebe, was macht das für einen Unterschied?
Hintereinander oder mit anderen Zeichen dazwischen? Jedes % passt auch auf 0 Zeichen. %% passt also auf 2x0 Zeichen. Es ist also egal, ob du eins oder mehrere hintereinander angibst. Diese Reglung kann in den anderen SQL-Dialekten anders ausfallen. Informiere dich dazu in der Dokumentation deines jeweiligen Systems.
Lo!
Hi!
Ist folgendes sinnvoll und valide:
like '/_kunde/grundlagen/dt%'
Für welche Aufgabenstellung genau?
Daraus erstelle ich dann z.B. einen HTML Link der dann auf das jeweilige Verzeichnis zeigt.
Der Unterstrich ist ein reserviertes Zeichen, oder?
Bei LIKE steht er für ein einzelnes beliebiges Zeichen. Wenn er für sich selbst stehen soll, musst du ihn maskieren. Das wäre beim % genauso.
Also so:like '/\_kunde/grundlagen/dt%'
?
Hi!
Ist folgendes sinnvoll und valide:
like '/_kunde/grundlagen/dt%'
Für welche Aufgabenstellung genau?
Daraus erstelle ich dann z.B. einen HTML Link der dann auf das jeweilige Verzeichnis zeigt.
Das interessiert an der Stelle noch nicht. Welche Daten möchtest du mit der Abfrage erhalten und vielleicht auch welche nicht?
Also so:
like '/\_kunde/grundlagen/dt%'
?
Die Antwort wäre also: Alles was mit der Zeichenfolge /_kunde/grundlagen/dt beginnt. Dann wäre die Variante mit dem maskierten _ sinnvoll im Sinne der Aufgabenstellung und gültige SQL-Syntax.
Lo!
Moin Moin!
Der Unterstrich ist ein reserviertes Zeichen, oder?
Ja, aber das kannst Du umgehen. Die gängigen RDBMS (MS SQL, MySQL, Oracle, PostgreSQL, SQLite) kennen die Notation 'a' LIKE 'b' ESCAPE 'c'. Details und Beispiele findest Du in der jeweiligen Dokumentation.
Alexander
Hi!
Der Unterstrich ist ein reserviertes Zeichen, oder?
Ja, aber das kannst Du umgehen.
Nein.
Die gängigen RDBMS (MS SQL, MySQL, Oracle, PostgreSQL, SQLite) kennen die Notation 'a' LIKE 'b' ESCAPE 'c'.
Zumindest bei MySQL kann man mit dem ESCAPE lediglich das Escape-Zeichen angeben. Die Jokerzeichen _ und % sind nicht konfigurierbar.
Lo!
Moin Moin!
Die gängigen RDBMS (MS SQL, MySQL, Oracle, PostgreSQL, SQLite) kennen die Notation 'a' LIKE 'b' ESCAPE 'c'.
Zumindest bei MySQL kann man mit dem ESCAPE lediglich das Escape-Zeichen angeben.
Mehr soll es ja auch nicht. Das gilt übrigens auch für die anderen RDBMS.
Die Jokerzeichen _ und % sind nicht konfigurierbar.
Muß ja auch nicht, Escaping reicht vollkommen aus.
... where foo like '!_a_' escape '!'
sucht alle Einträge, bei denen foo aus exakt drei Zeichen besteht, das erste ein Unterstrich ist, das zweite ein 'a', und das dritte Zeichen beliebig.
Entsprechend sucht
... where foo like '50*% von nichts sind %' escape '*'
alle Einträge, bei denen foo mit '50% von nichts sind ' anfängt (hier wäre substr() vermutlich effizienter).
Und um auf Jürgens Frage zu kommen:
... where foo like '/!_kunde/grundlagen/dt%' escape '!'
sucht nach Einträgen, die mit '/_kunde/grundlagen/dt' beginnen, und auch hier wäre substr() vermutlich effizienter.
Ach ja, bevor ich es vergesse: Das Escape-Zeichen selbst kann man natürlich auch escapen:
... where foo like '50!% von nichts sind % !!' escape '!'
sucht nach Einträgen, bei denen foo mit '50% von nichts sind ' anfängt, dann null oder mehr beliebige Zeichen hat, und schließlich mit ' !' endet.
Alexander
Hi!
Die gängigen RDBMS (MS SQL, MySQL, Oracle, PostgreSQL, SQLite) kennen die Notation 'a' LIKE 'b' ESCAPE 'c'.
Zumindest bei MySQL kann man mit dem ESCAPE lediglich das Escape-Zeichen angeben.
Mehr soll es ja auch nicht. Das gilt übrigens auch für die anderen RDBMS.
Dann hab ich dich wohl falsch verstanden, als du sagtest, dass man ohne den _ auskommt ...
Lo!
Moin Moin!
Dann hab ich dich wohl falsch verstanden, als du sagtest, dass man ohne den _ auskommt ...
Wo hab ich das denn geschrieben?
Alexander
Hi!
Dann hab ich dich wohl falsch verstanden, als du sagtest, dass man ohne den _ auskommt ...
Wo hab ich das denn geschrieben?
Nicht so direkt, aber ich habe dein erstes Posting so gedeutet, als ob man den _ umgehen kann. Du meintest wohl eher, dass man die Sonderbedeutung umgehen kann.
Dazu braucht es übrigens den ESCAPE-Zusatz nicht unbedingt, denn mit dem \ gibt es bereits ein Default-Escape-Zeichen.
Lo!
Moin Moin!
Dazu braucht es übrigens den ESCAPE-Zusatz nicht unbedingt, denn mit dem \ gibt es bereits ein Default-Escape-Zeichen.
Und genau das ist DB-spezifisch:
Oracle: If esc_char is not specified, then there is no default escape character.
PostgreSQL (8.3, 9.0): The default escape character is the backslash but a different one can be selected by using the ESCAPE clause. [...] It's also possible to select no escape character by writing ESCAPE ''. This effectively disables the escape mechanism, which makes it impossible to turn off the special meaning of underscore and percent signs in the pattern.
SQL Server (2008 R2, 2000): escape_character is a character expression that has no default and must evaluate to only one character.
MySQL: If you do not specify the ESCAPE character, “\” is assumed.
SQLite: If the optional ESCAPE clause is present, then the expression following the ESCAPE keyword must evaluate to a string consisting of a single character. This character may be used in the LIKE pattern to include literal percent or underscore characters. The escape character followed by a percent symbol (%), underscore (_), or a second instance of the escape character itself matches a literal percent symbol, underscore, or a single escape character, respectively.
Das lese ich so, dass SQLite kein Standard-Escape-Zeichen hat. Im Source-Code will ich jetzt nicht wühlen. ;-)
Also: Wenn man DB-übergreifend arbeiten will, immer ESCAPE angeben, wenn man nicht-triviale Ausdrücke rechts vom LIKE hat. Insbesondere, wenn die Ausdrücke vom User oder aus dem Netz kommen.
Alexander