Re: String Funktion

From: Peter Wullinger <some-mail-drop(at)gmx(dot)net>
To: Markus Bertheau <twanger(at)bluetwanger(dot)de>
Cc: postgresql(at)zoominit(dot)de, pgsql-de-allgemein(at)postgresql(dot)org
Subject: Re: String Funktion
Date: 2004-08-23 11:19:09
Message-ID: 20040823111909.GA1323@peter.home.wul
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-de-allgemein

In epistula a Markus Bertheau, die horaque Mon, Aug 23, 2004 at 12:06:22PM +0200:
> В Пнд, 23.08.2004, в 11:02, postgresql(at)zoominit(dot)de пишет:
> > Hallo @all,
> >
> > existiert in PostgreSQL eine Funktion, die die Position des ersten
> > Zeichens der ersten Zeichenkette, das nicht in der 2. Zeichenkette
> > enthalten ist, liefert?
> >
> > abc := 'abcdefghijklmnopqrstuvwxyz';
> >
> > funktion ('Meier, 1234', abc )
> >
> > Würde in diesem Fall 6 ergeben (Das Komma ist nicht in der 2.
> > Zeichenkette enthalten).
>
> Damit das stimmt, muss die Funktion auch Gross- und Kleinschreibung
> außer Acht lassen. Ich bezweifle, dass es eine solche Funktion in
> PostgreSQL eingebaut gibt.

Das wäre das geringste Problem, man kann ja alles erst einmal
in Kleinschreibung (funktioniert auch im Unicode-Fall) konvertieren
und dann so vergleichen.

Nützen tut das allerdings immer noch nichts, weil es die Funktion
strspn() (so würde sie wohl heißen) in PostgreSQL nicht gibt.

In PL/pgSQL würde sie wahrscheinlich in etwa so aussehen:

== strspn.sql ==
DROP FUNCTION strspn(TEXT, TEXT);
CREATE FUNCTION strspn(TEXT, TEXT) RETURNS INTEGER AS '
DECLARE
s ALIAS FOR $1;
charset ALIAS FOR $2;
i INTEGER;
p INTEGER;
c TEXT;
BEGIN
i := 1;
WHILE (i <= char_length(s)) LOOP
c := substring(s, i, 1);
p := strpos(charset, c);
if (p = 0) THEN
RETURN i;
END IF;
i := i + 1;
END LOOP;
RETURN 0;
END;
' LANGUAGE 'plpgsql';
== strspn.sql ==

psql: ~# SELECT strspn(lower('Meier, 1234'), 'abcdefghijklmnopqrstuvwxyz');
strspn
--------
6
(1 row)

psql: ~#

Sinnvoller wäre allerdings eine Implementierung als ladbare Funktion
in C, da sich gerade bei Stringoperationen der Geschwindigkeitsvorteil
stark bemerkbar macht. Probleme machen hier allerdings die verschiedenen
Zeichensätze, die man innerhalb der Funktion behandeln muß und dazu bin
ich -- ehrlich gesagt -- jetzt zu faul ;-).

Gruß,
Peter

--
Keinem vernünftigen Menschen wird es einfallen, Tintenflecken mit Tinte,
Ölflecken mit Öl wegwaschen zu wollen. Nur Blut soll immer wieder mit Blut
abgewaschen werden.
-- Bertha von Suttner

In response to

Browse pgsql-de-allgemein by date

  From Date Subject
Next Message Andreas Seltenreich 2004-08-23 16:55:02 Re: String Funktion
Previous Message Markus Bertheau 2004-08-23 10:06:22 Re: String Funktion