Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Sortieren nach Laenge gemeinsamer Teilstrings

4 views
Skip to first unread message

Stefan Froehlich

unread,
Aug 13, 2012, 1:24:24 PM8/13/12
to
Ich soll die Ergebnisse einer Abfrage nach der Laenge der Uebereinstimmung
eines Feldwerts mit einem vorgegebenen String sortieren, also z.B. bei der
Vorgabe "abcde" ergibt sich die Reihenfolge

| abcdeabcde (5 Zeichen Uebereinstimmung)
| abcdebbcde
| abcabcde (3 Zeichen Uebereinstimmung)
| abcbbcde
| aabcde (1 Zeichen Uebereinstimmung)
| abbcde

Laesst sich so etwas in SQL (oder ggf. auch mit PostgreSQL Erweiterungen)
umsetzen? Mir faellt dazu gerade so _ueberhaupt_ nichts ein...

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Egal ob Richter oder Dichter: Stefan - aalen, wenn sie zwei linke Hände haben!
(Sloganizer)

Siegfried Schmidt

unread,
Aug 13, 2012, 3:16:38 PM8/13/12
to
Stefan Froehlich schrieb:

> Ich soll die Ergebnisse einer Abfrage nach der Laenge der
> Uebereinstimmung eines Feldwerts mit einem vorgegebenen String
> sortieren, also z.B. bei der Vorgabe "abcde" ergibt sich die
> Reihenfolge


CREATE OR REPLACE FUNCTION sortx(wert text, sortierung text)
RETURNS integer AS
$BODY$
declare
i integer;
begin
for i in reverse char_length(sortierung) .. 0 loop
if wert like left(sortierung,i) || '%' then return i; end if;
end loop;
return i;
end;
$BODY$
LANGUAGE plpgsql VOLATILE;

und dann:

select ... order by sortx(feld,vorgabe);

Siegfried

Bernd Nawothnig

unread,
Aug 13, 2012, 3:38:49 PM8/13/12
to
On 2012-08-13, Siegfried Schmidt wrote:
> Stefan Froehlich schrieb:
>
>> Ich soll die Ergebnisse einer Abfrage nach der Laenge der
>> Uebereinstimmung eines Feldwerts mit einem vorgegebenen String
>> sortieren, also z.B. bei der Vorgabe "abcde" ergibt sich die
>> Reihenfolge
>
>
> CREATE OR REPLACE FUNCTION sortx(wert text, sortierung text)
> RETURNS integer AS
> $BODY$
> declare
> i integer;
> begin
> for i in reverse char_length(sortierung) .. 0 loop
> if wert like left(sortierung,i) || '%' then return i; end if;
> end loop;
> return i;
> end;
> $BODY$
> LANGUAGE plpgsql VOLATILE;
IMMUTABLE;

könntest Du hier sogar sagen.

Wird das überhaupt vom Planner ausgewertet?




Bernd

--
"Die Antisemiten vergeben es den Juden nicht, dass die Juden Geist
haben - und Geld." [Friedrich Nietzsche]

Siegfried Schmidt

unread,
Aug 13, 2012, 4:02:50 PM8/13/12
to
Bernd Nawothnig schrieb:

> IMMUTABLE;
>
> könntest Du hier sogar sagen.

Ja.

> Wird das ÃŒberhaupt vom Planner ausgewertet?

Wenn, dann macht es hier nicht viel aus.


Siegfried

Stefan Froehlich

unread,
Aug 13, 2012, 7:15:31 PM8/13/12
to
On Mon, 13 Aug 2012 21:16:38 Siegfried Schmidt wrote:
> CREATE OR REPLACE FUNCTION sortx(wert text, sortierung text)
> RETURNS integer AS
> $BODY$
> declare
> i integer;
> begin
> for i in reverse char_length(sortierung) .. 0 loop
> if wert like left(sortierung,i) || '%' then return i; end if;
> end loop;
> return i;
> end;
> $BODY$
> LANGUAGE plpgsql VOLATILE;

Cool, danke!

Etwas ueberraschend wurde es dann

| if result like substring(location from 1 for i)

(postgresql war aelter, als ich dachte), aber das war kein Drama mehr.

Servus,
Stefan

--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Offizieller Erstbesucher(TM) von mmeike

Auf die Verpackung kommt's nicht an - Stefan: sterben, welch himmlisches Verlieben!
(Sloganizer)
0 new messages