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

Thema: Neue Spalte aus vorhanden Spalten

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

    Standard Neue Spalte aus vorhanden Spalten

    Hallo

    Folgendes würd ich gerne machen:

    Ich hab eine Tabelle mit ca. 13 Millionen Adressdaten.
    In dieser Tabelle befinden sich die Spalten ID, Hnr, Strasse, PLZ, Ort und Land.

    Nun möchte ich eine zusätzliche Spalte in dieser Tabelle definieren, die folgenden Eintrag hat:
    ID || ' ' || HNr || ' ' || Strasse || ' ' || PLZ || ' ' || Ort || ' ' || Land

    Da der Datensatz so gross ist sehe ich keine Möglichkeit dies in einem Editor oder Excell zu machen.

    Gibt es eine Möglichkeit dies automatisch mit einer Funktion durchzuführen?

    z.B. in etwa so:

    ALTER TABLE testtabelle ADD COLUMN test text;
    INSERT INTO testtabelle (test) VALUES (..Funktion..)

    Oder gibt es hierfür eine viel einfachere Möglichkeit?

    Freundliche Grüsse

  2. #2
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    493

    Standard

    Es gibt keinen Grund die Daten doppelt zu speichern.
    Definiere einfach eine VIEW welche die "berechnete" Spalte enthält
    Code:
    CREATE VIEW v_test
    AS
    SELECT id, 
           ID || ' ' || HNr || ' ' || Strasse || ' ' || PLZ || ' ' || Ort || ' ' || Land as komplette_adresse
    FROM testtabelle
    Übrigens: wenn eine der Spalten NULL ist, liefert der ganze Ausdruck NULL zurück. Vermutlich willst Du noch ein coalesce(<spalte>, '') für jede (nullable) Spalte verwenden
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

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

    Standard

    Die Idee ist gut.

    Doch so viel ich weiss, ist es nicht möglich einen Index über eine Sicht zu definieren.
    Die neue Tabellenspalte brauch ich, damit ich einen GIST Index für meine Abfrage verwenden kann.

    Abfrage:

    PERFORM set_limit(sim_minimum);
    FOR rec IN SELECT Hnr, Strasse, PLZ, Ort, Land, astext(geom), similarity(Input_norm, Strasse || ' ' || Hnr || ' ' || PLZ || ' ' || Ort || ' ' || Land) AS sim FROM testtabelle
    WHERE Input_norm % (Strasse || ' ' || HNr || ' ' || PLZ || ' ' || Ort || ' ' || Land)
    ORDER BY sim, street DESC
    Limit 5
    LOOP

    RETURN NEXT rec;

    END LOOP;

  4. #4
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    493

    Standard

    Ach so es geht um's Indizieren, gar nicht um eine berechnte Spalte.

    Da müsste es doch reichen einen entsprechenden Index auf der Basis-Tabelle zu definieren.
    Ich kenne mich mit GIST Indizes überhaupt nicht aus. Aber einen normalen Index kann man über den Ausdruck definieren.

    Einen normalen Index könnte man problemlos so definieren:
    Code:
    CREATE INDEX idx_sim ON testtabelle (  (Strasse || ' ' || HNr || ' ' || PLZ || ' ' || Ort || ' ' || Land)  )
    Geht sowas mit einem GIST Index nicht?

    Was genau macht denn der % Operator in Deinem Beispiel?
    Wäre die Volltextsuche vielleicht eine Alternative?
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

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

    Standard

    Hab das mal ausprobiert

    Den GIST Index wollte ich mit folgendem Befehl kreieren:

    Code:
    CREATE INDEX idx_kombi
      ON address
      USING gist((housenumber || ' ' || street || ' ' ||  postcode || ' ' || city || ' ' ||  country) gist_trgm_ops);
    Leider hat er das nicht verstanden und den Index in dieser Form gemacht:

    Code:
    CREATE INDEX idx_kombi
      ON address
      USING gist
      (((((((((housenumber::text || ' '::text) || street::text) || ' '::text) || postcode::text) || ' '::text) || city::text) || ' '::text) || country::text) gist_trgm_ops);
    Schade eigentlich.

  6. #6
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    493

    Standard

    Zitat Zitat von tme2525 Beitrag anzeigen
    Schade eigentlich.
    Die Bemerkung verstehe ich nicht.

    Wird der Index denn verwendet?

    Edit: wenn das mit dem Index gar nicht klappt und Du doch eine eigene Spalte machen willst, dann dürfte die schnellste Methode via ADD COLUMN und UPDATE sein:

    Code:
    ALTER TABLE orginal ADD COLUMN volle_adresse text;
    UPDATE orginal 
      SET volle_addresse = Strasse || ' ' || HNr || ' ' || PLZ || ' ' || Ort || ' ' || Land;
    Du musst dann natürlich über einen Trigger dafür sorgen, dass die Spalte auch immer aktualisiert wird.
    Wie gesagt: Volltextsuche ist vielleicht doch die bessere Alternative.
    Geändert von castorp (16.08.2010 um 16:56 Uhr)
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

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

    Standard

    Merci für die Antwort

    Den GIST Index verwendet er nicht.

    Volltextsuche kommt nicht in Frage, weil ich ein Rating brauch.
    Dafür verwende ich die pg_trgm similarity Funktion und den % Operator.

    So wie ich das sehe, ist die einzige Möglichkeit eine neue Spalte zu definieren. Leider kenn ich mich mit Trigger überhaupt nicht aus.

    Hat sonst vielleicht noch jemand eine Idee, wie ich es ohne Trigger machen könnte?
    Ist dies überhaupt möglich?

    Gruss

  8. #8
    castorp ist offline Erfahrener Benutzer
    Registriert seit
    27.06.2009
    Beiträge
    493

    Standard

    Zitat Zitat von tme2525 Beitrag anzeigen
    Hat sonst vielleicht noch jemand eine Idee, wie ich es ohne Trigger machen könnte?
    Ist dies überhaupt möglich?
    Nein, ohne Trigger kannst Du die zusätzliche Spalte nicht akutell halten.
    A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

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

    Standard

    Könntest du mir vielleicht ein Beispiel geben, wie der Trigger aussehen müsste.

    Würde mir sehr weiterhelfen.

  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
    Könntest du mir vielleicht ein Beispiel geben, wie der Trigger aussehen müsste.

    Würde mir sehr weiterhelfen.
    Was soll da drin stehen? Nur die mit || verbundenen Werte anderer Spalten, um dann darüber einen Index zu legen? Reicht nicht auch sowas:

    Code:
    test=# create table tme (a text, b text, c text);
    CREATE TABLE
    test=*# create index idx_tme on tme((a || b || c));
    CREATE INDEX
    test=*# \d tme
        Table "public.tme"
     Column | Type | Modifiers
    --------+------+-----------
     a      | text |
     b      | text |
     c      | text |
    Indexes:
        "idx_tme" btree (((a || b) || c))
    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

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