Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-de-allgemein by date

Next:From: Andreas SeltenreichDate: 2004-08-23 16:55:02
Subject: Re: String Funktion
Previous:From: Markus BertheauDate: 2004-08-23 10:06:22
Subject: Re: String Funktion

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group