Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Abfrageergebnisse

  1. #1
    tme2525 ist offline Benutzer
    Registriert seit
    27.06.2010
    Beiträge
    34

    Standard Abfrageergebnisse

    Hallo Zusammen

    Mit Hilfe von pg_trgm möchte ich mehrere Einträge aus einer Tabelle exportieren.
    Und zwar mit der similiarity Funktion.

    In etwa so hab ich mir das Vorgestellt:

    -- similiarity Werte
    sim_minimum_strasse := 0.45;

    Perform set_limit(sim_minimum_strasse);
    SELECT INTO rec street, similarity(norm.strasse, street) AS sim
    FROM address WHERE
    street % norm.strasse
    ORDER BY sim DESC;

    Diese Abfrage sollte in vielen Fällen mehrere Ergebnisse liefern.

    Frage:
    Wie kann man all die Ergebniszeilen in einem Output abspeichern?
    Ist dies nur über eine Tabelle möglich?

    Beispiel Ergebnis:
    street sim
    Teststrasse 1
    Teststrase 0.5
    etc.

    Gruss

  2. #2
    tme2525 ist offline Benutzer
    Registriert seit
    27.06.2010
    Beiträge
    34

    Standard

    Problem gelöst

  3. #3
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von tme2525 Beitrag anzeigen
    Problem gelöst
    Schön. Schöner wäre, Du würdest uns an Deiner Lösung teilhaben lassen.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  4. #4
    tme2525 ist offline Benutzer
    Registriert seit
    27.06.2010
    Beiträge
    34

    Standard

    Ja ich dachte ich hätte das Problem gelöst.

    Doch nun steh ich wieder am Anfang und komm nicht weiter.

    Irgendwie müsste das doch mit record funktionieren!!!

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von tme2525 Beitrag anzeigen
    Diese Abfrage sollte in vielen Fällen mehrere Ergebnisse liefern.

    Frage:
    Wie kann man all die Ergebniszeilen in einem Output abspeichern?
    Ist dies nur über eine Tabelle möglich?
    Das ist bei Datenbanken der übliche Weg ...

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von tme2525 Beitrag anzeigen
    Ja ich dachte ich hätte das Problem gelöst.

    Doch nun steh ich wieder am Anfang und komm nicht weiter.

    Irgendwie müsste das doch mit record funktionieren!!!
    Ja, man kann Record-Variablen verwenden.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    tme2525 ist offline Benutzer
    Registriert seit
    27.06.2010
    Beiträge
    34

    Standard

    So in etwa möchte ich das bewerkstelligen:

    CREATE OR REPLACE FUNCTION tm_match("input" character varying)
    RETURNS setof records AS
    $BODY$
    DECLARE
    rec record
    Begin
    PERFORM set_limit(sim_minimum_country);
    SELECT INTO rec DISTINCT country AS VARCHAR, similarity(norm.Land, country) AS sim
    FROM address
    WHERE
    country % norm.Ort
    ORDER BY sim DESC;

    Die Frage ist nur, wie ich es hinbekomme dass er mir alle Ergebnisse in rec speichert.

    Brauch ich dafür eine Loop und dann mit RETURN NEXT rec?
    Oder versteh ich da was falsch?

  8. #8
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von tme2525 Beitrag anzeigen
    So in etwa möchte ich das bewerkstelligen:



    Die Frage ist nur, wie ich es hinbekomme dass er mir alle Ergebnisse in rec speichert.

    Brauch ich dafür eine Loop und dann mit RETURN NEXT rec?
    Ja. Die Doku enthält sogar Beispiele dafür. Du kannst auch RETURN QUERY verwenden. Eine Record-Variable enthält nur eine Zeile einer Tabelle, nicht die komplette Tabelle.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    tme2525 ist offline Benutzer
    Registriert seit
    27.06.2010
    Beiträge
    34

    Standard

    Ich hab es mal auf diese Weise versucht:

    FOR rec IN SELECT street FROM address WHERE street = norm.strasse LOOP
    RETURN NEXT rec;
    END LOOP;
    RETURN;

    Die Abfrage wird durchgeführt, doch bei RETURN NEXT rec kommt folgende Fehlermeldung:
    FEHLER: Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der keine Mengenergebnisse verarbeiten kann.
    Verste ich irgendwie nicht ganz.

  10. #10
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von tme2525 Beitrag anzeigen
    Ich hab es mal auf diese Weise versucht:

    FOR rec IN SELECT street FROM address WHERE street = norm.strasse LOOP
    RETURN NEXT rec;
    END LOOP;
    RETURN;

    Die Abfrage wird durchgeführt, doch bei RETURN NEXT rec kommt folgende Fehlermeldung:
    FEHLER: Funktion mit Mengenergebnis in einem Zusammenhang aufgerufen, der keine Mengenergebnisse verarbeiten kann.
    Verste ich irgendwie nicht ganz.
    In was für einem Zusammenhang ruftst das denn auf? Vermutlich nicht als select * from my_srf(), oder?

    Andreas, der grade merkt, daß 8.4 da nicht meckert ...

    Code:
    test=*> create table foo (a int);
    CREATE TABLE
    test=*> copy foo from stdin;
    Enter data to be copied followed by a newline.
    End with a backslash and a period on a line by itself.
    >> 4
    >> 5
    >> 6
    >> \.
    test=*> create or replace function get_foo(out x int, out y int) returns setof record as $$declare r record; begin for r in select a from foo loop x:=r.a; y:= r.a * 10; return next; end loop; end; $$language plpgsql;
    CREATE FUNCTION
    test=*> select get_foo();
    ERROR:  set-valued function called in context that cannot accept a set
    CONTEXT:  PL/pgSQL function "get_foo" line 1 at return next
    test=!>
    das war 8.1.

    versus 8.4:
    Code:
    test=*# select * from foo;
     a
    ---
     4
     5
     6
    (3 rows)
    
    test=*# select get_foo();
     get_foo
    ---------
     (4,40)
     (5,50)
     (6,60)
    (3 rows)
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum