Groß- und Kleinschreibung beachten bei like?

Dream-Teacher

Benutzer
Beiträge
20
Moinsen, Moinsen liebe Experten,

ich habe eine Frage....

derzeit habe ich folgendes SQL-Statement

select id from tablename where name like '07C%'

Blöderweise wird bei like die Groß- und Kleinschreibung nicht unterdrückt.

Ich möchte, dass wirklich nur nach 07C... und NICHT nach 07c gesucht wird!

Wir heißt dann das Statement?


Danke für Eure Hilfe und beste Grüße
 
Werbung:
Folgendes:

Es gibt, wie ich denke bei jedem SQL eine lower() und upper() Funktion...

Das bedeutet, dein Code oben wäre anders gewählt:
Code:
select id from tablename where lower(name) = lower('07C%')

War mir kurz nicht sicher, ob das auch mit Sonderzeichen geht, aber es geht offenbar ;)

Im Gegenteil, es gibt auch eine Upper-Funktion:
Code:
select id from tablename where upper(name) = upper('07C%')

EDIT:
Das in deinem Beispiel mit like braucht man nur, wenn man die Concat-Funktion verwendet (wüsste jetzt nicht, wann noch)

Concat-Beispiel:
Code:
select id from tablename where upper(name) = upper('0'||'%')

EDIT 2:
schlechtes Beispiel, ich denke das like ist ein Synonym zu "="

EDIT3:
Hatte doch recht mit erster Annahme, das like braucht man (wie ich denke) nur, wenn man die Concat-Funktion in der where-Klausel nutzt.
 
Zuletzt bearbeitet:
Als Ergänzung:
Es gibt collations, deren Einsatz als Default Collation pro Datenbank, Tabelle oder Spalte im Datenmodell angegeben werden kann. Collations können case sensitive sein oder case insensitive. Wenn die default collation insensitive ist, kann man also unabhängig von Großkleinschreibung vergleichen.
Der Einsatz von Funktionen wie Upper verhindert die Anwendung eines normalen Index und macht die Suche damit langsam und teuer.
 
Als Ergänzung:
Es gibt collations, deren Einsatz als Default Collation pro Datenbank, Tabelle oder Spalte im Datenmodell angegeben werden kann. Collations können case sensitive sein oder case insensitive. Wenn die default collation insensitive ist, kann man also unabhängig von Großkleinschreibung vergleichen.
Der Einsatz von Funktionen wie Upper verhindert die Anwendung eines normalen Index und macht die Suche damit langsam und teuer.

und wieder einmal was dazugelernt ;)
Danke ;D
 
Sorry, ich habe mich eventuell nicht richtig ausgedrückt...

select id, name from table_name where name like 'Weber%';

Ich möchte erreichen, dass Wirklich NUR Weber% und NICHT nach 'weber%' gesucht wird...

Sowohl
  • select id, name from table_name where name like 'Weber%';
  • select id, name from table_name where upper(name) like upper('Weber%');
  • select id, name from table_name where lower(name) like lower('Weber%');
liefert das gleiche Ergebnis :-(

Wie kann ich es also erreichen, dass der ERSTE BUCHSTABE bei der Suche berücksicchtigt wird ... aso

select id, name from table_name where name = 'Weber%';

bringt kein Ergebnis .... kann man hier einen anderen Platzhalter nutzen?
 
Mit PostgreSQL (siehe 9.7. Pattern Matching) hättest Du da einige Möglichkeiten mehr, auch könnte man da auf das Ergebniss einer Funktion wie lower() oder upper() einen Index legen.
Das nur mal so als Hinweis ...

Danke, leider habe ich zum Thema index, das wäre genau das was ich bräuchte, nichts gefunden... könntest Du mir ggf. ein Beispiel geben? inde

Also select * from table_name where col_name like upper(value, index?);
 
Code:
edb=*# select * from dream_teacher;
 id | name  
----+-------
  1 | Weber
  2 | wEBER
  3 | wEbEr
  4 | WeBeR
(4 rows)

edb=*# create index idx_lower_name on dream_teacher (lower(name));
CREATE INDEX
edb=*# set enable_Seqscan to off;
SET
edb=*# explain analyse select * from dream_teacher where lower(name) = 'weber';
                                                          QUERY PLAN                                                           
-------------------------------------------------------------------------------------------------------------------------------
 Index Scan using idx_lower_name on dream_teacher  (cost=0.13..8.15 rows=1 width=36) (actual time=0.026..0.031 rows=4 loops=1)
   Index Cond: (lower(name) = 'weber'::text)
 Planning Time: 0.122 ms
 Execution Time: 0.063 ms

das "set enable_seqscan to off" ist nötig, weil aufgrund des kostenbasierten Optimizers (Tabelle ist 1 Block auf Disk, Index auch) ein Seq-Scan trotz Index normalerweise günstiger ist:

Code:
edb=*# set enable_Seqscan to on;
SET
edb=*# explain analyse select * from dream_teacher where lower(name) = 'weber';
                                               QUERY PLAN                                               
--------------------------------------------------------------------------------------------------------
 Seq Scan on dream_teacher  (cost=0.00..1.06 rows=1 width=36) (actual time=0.026..0.033 rows=4 loops=1)
   Filter: (lower(name) = 'weber'::text)
 Planning Time: 0.110 ms
 Execution Time: 0.061 ms
(4 rows)

Natürlich kannst Du auch LIKE etc. verwenden mit solch einem Index.
 
Sorry, ich habe mich eventuell nicht richtig ausgedrückt...
..
Ich möchte erreichen, dass Wirklich NUR Weber% und NICHT nach 'weber%' gesucht wird...

Sowohl
  • select id, name from table_name where name like 'Weber%';
  • select id, name from table_name where upper(name) like upper('Weber%');
  • select id, name from table_name where lower(name) like lower('Weber%');
liefert das gleiche Ergebnis :-(

Wie kann ich es also erreichen, dass der ERSTE BUCHSTABE bei der Suche berücksicchtigt wird ... aso

select id, name from table_name where name = 'Weber%';

bringt kein Ergebnis .... kann man hier einen anderen Platzhalter nutzen?

Sorry, aber vielleicht kannst Du Dich mal präzise ausdrücken.
'..nur Weber%..', '..liefert das gleiche Ergebnis..', '..bringt kein Ergebnis..', ..

Was denn nun? Wenn 3 verschiedene Abfragen das gleiche Ergebnis liefern und eine davon liefert kein Ergebnis, dann liefern alle 3 kein Ergebnis?

Wenn es um exakte Schreibweise geht plus Wildcard, also Case Sensitiv, nicht Case Insensitiv, gilt die gleiche Antwort wie zuvor. Nimm eine zu Deinen Bedürfnissen passende Collation.
 
Werbung:
Zurück
Oben