GROSSBuchstaben finden

Ich gestehe: Ich habe beim Design geschlampt.

Jetzt hab ich das Problem, dass ich in einer Tabelle mit einem Unique-Index Feldkombinationen wie

ID NAME (unique)

1 ‘Mein Fehler’
2 ‘mein fehler’
3 ‘MEIN FEHLER’


habe.

  1. Gibt es ein einfaches SELECT-Statement, das mir alle Zeilen zurückgibt, die in der Spalte “NAME” einen oder mehrere Grossbuchstaben haben?

  2. Wie kann ich vermeiden, dass sowas zukünftig eingetragen wird? - Kann ich den index auf case-insensitive stellen?
    Einen Trigger möchte ich eigentlich nicht setzen, da in die Tabelle sehr viel inserted wird und die Inserts in diese Tabelle schon jetzt der Flaschenhals in meiner Applikation sind.

Für jede Hilfe dankbar,

Thomas



test=*# select * from foo;
 id | name
----+------
  1 | a
  2 | aA
  3 | AA
(3 rows)

test=*# select * from foo where name ~ '[A-Z]';
 id | name
----+------
  2 | aA
  3 | AA
(2 rows)



  1. Wie kann ich vermeiden, dass sowas zukünftig eingetragen wird? - Kann ich den index auf case-insensitive stellen?

Ja, ich würde zu einem CHECK-Constraint raten.

test=# create table foo (id serial, name text check (name ~ '^[A-Z]*$'));
NOTICE:  CREATE TABLE will create implicit sequence "foo_id_seq" for serial column "foo.id"
CREATE TABLE
test=*# insert into foo (name) values ('ABC');
INSERT 0 1
test=*# insert into foo (name) values ('AbC');
ERROR:  new row for relation "foo" violates check constraint "foo_name_check"
test=!#

Andreas

Erstmal vielen Dank - soweit funktioniert das Prima!

Das Constraint möchte ich unter dem namen "caselsessuniq-names zur bestehenden Tabelle hinzufügen. Erlaubt sein sollen a-z, 0-9 “.” und “-”. Nach meinem beschränkten Verständnis von Regular Expressions und SQL sollte das (für die Spalte “hostname” dann so aussehen:

ALTER TABLE "names" ADD CONSTRAINT "caselessuniq-names" CHECK (hostname ~ '^[0-9a-z.-]*$'))

Sehe ich das richtig?

Und wie muss dann der Query aussehen, um alle bestehenden Zeilen zu finden, die nicht in das obige Constraint-Schema passen? - meine ersten Versuche sind da leider fehlgeschlagen…

Thomas

schön

Das Constraint möchte ich unter dem namen "caselsessuniq-names zur bestehenden Tabelle hinzufügen. Erlaubt sein sollen a-z, 0-9 “.” und “-”. Nach meinem beschränkten Verständnis von Regular Expressions und SQL sollte das (für die Spalte “hostname” dann so aussehen:

ALTER TABLE “names” ADD CONSTRAINT “caselessuniq-names” CHECK (hostname ~ ‘[1]*$’))

>
> Sehe ich das richtig?

scheint so

> Und wie muss dann der Query aussehen, um alle bestehenden Zeilen zu finden, die nicht in das obige Constraint-Schema passen? - meine ersten Versuche sind da leider fehlgeschlagen....
>
> Thomas

... where <your_field> !~ '^[0-9a-z.-]*$'

;-)

Andreas

  1. 0-9a-z.- ↩︎