Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Spalte auslesen und in neue überführen

Dieses Thema im Forum "PostgreSQL" wurde erstellt von JimGeoinf, 10 August 2015.

  1. JimGeoinf

    JimGeoinf Neuer Benutzer

    Hallo,

    ich hoffe hier hat irgendwer eine Lösung für mich, da ich bei dem Problem irgendwie auf dem Schlauch stehe.

    Ich habe eine Tabelle points die ist wie folgt aufgebaut:

    gid | [...] | other_tags
    ---------------------------
    1 | [...] | "entrance"=>"yes"
    2 | [...] | "access"=>"private","entrance"=>"yes"
    3 | [...] | NULL
    4 | [...] | "access"=>"yes","addr:country"=>"DE","entrance"=>"main","level"=>"0","wheelchair"=>"yes"
    [...]


    Die Einträge unter other_tags sind beispielhaft es können auch andere Werte drin stehen und vor allen auch mehr Werte.

    So mein Problem ist, das ich mit den Werten in einer Spalte nichts anfangen kann, ich brauche sie auf verschiedene Spalten aufgeteilt. Daher bin ich auf der Suche nach einer Lösung, die mir automatisch die Spalte ausliest und neue Spalten mit den Werten anlegt. Dass es am Ende in etwa so aussieht:


    gid | [...] | other_tags | entrance | access | addr:contry | level | wheelchair
    --------------------------------------------------------------------------------------------------
    1 | [...] | [...] | yes | | | |
    [...]
    4 | [...] | [...] | main | yes | DE | 0 | yes


    Hat irgendwer von euch dazu eine Lösungsidee? Alternativ könnte ich auch die Spalten, die ich brauche, vorher anlegen und diese dann befüllen. Allerdings stehe ich da auch auf dem Schlauch, wie ich die richtigen Werte ermittel. Eins meiner Probleme sind die ganzen Anführungszeichen in der Spalte.


    Gruß

    Martin
     
  2. Distrilec

    Distrilec Datenbank-Guru

    Hi, das ginge wohl in etwa so...
    &tag ist in diesem Fall eine Replacement-Variable... Die müsste dann durch das gewollte Attribut ersetzt werden... als quasi access, entrance, wheelchair, etc.
    Code:
    Select gid
          ,other_tags
          ,Case
              When instr(other_tags, '"&tag"', 1, 1) = 0 Then
               Null
              Else
               substr(other_tags, instr(other_tags, '"&tag"', 1, 1) + length('"&tag"') + 2,
                      instr(other_tags, '"', instr(other_tags, '"&tag"', 1, 1) + length('"&tag"') + 3, 1) -
                       (instr(other_tags, '"&tag"', 1, 1) + length('"&tag"') + 1))
           End As attribute
    From   dat
    Wenn du einen Variablen abgleich haben willst wird das wohl etwas mehr Gehirnschmalz brauchen... Sollte bis zu einem gewissen grad aber auch möglich sein...

    Edit: Wenn du die Anführungszeichen vor und nach dem Wert nicht haben willst einfach ein Trim drüber legen (oder das equivalente Gegenstück von Postgre... Wie auch immer es sich nennen mag :) )
     
    JimGeoinf gefällt das.
  3. JimGeoinf

    JimGeoinf Neuer Benutzer

    Funktioniert! Super, da wäre ich nie alleine drauf gekommen.

    Danke schön!
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Unabhängig davon, daß Du ja schon eine Antwort hast (ich war im Urlaub): Du hast PostgreSQL und speicherst Key-Value - Paare als Text. Warum? PostgreSQL bietet dafür bessere Datentypen, HSTORE und JSON(B).

    Davon abgesehen: Du vergewaltigst grad die DB. Dir ist ja nicht bekannt, welche Keys es alles gibt. Daher ist das, was Du machst, nicht dynamisch, es ist starr.

    Ich zeigt Dir mal kurz eine Demo mit HSTORE:

    Code:
    test=*# \d hstore_test
      Table "public.hstore_test"
     Column |  Type  | Modifiers
    --------+---------+-----------
     id  | integer | not null
     data  | hstore  |
    Indexes:
      "hstore_test_pkey" PRIMARY KEY, btree (id)
    
    test=*# select * from hstore_test ;
     id |  data
    ----+----------------------------------------------------------------------------------------------
      1 | "entrance"=>"yes"
      2 | "access"=>"private", "entrance"=>"yes"
      4 | "level"=>"0", "access"=>"yes", "entrance"=>"main", "wheelchair"=>"yes", "addr:country"=>"DE"
    (3 rows)
    
    Time: 0,176 ms
    test=*# select id, skeys(data), svals(data) from hstore_test ;
     id |  skeys  |  svals
    ----+--------------+---------
      1 | entrance  | yes
      2 | access  | private
      2 | entrance  | yes
      4 | level  | 0
      4 | access  | yes
      4 | entrance  | main
      4 | wheelchair  | yes
      4 | addr:country | DE
    (8 rows)
    
    Du kannst auch passende Indexe dafür setzen, http://www.postgresql.org/docs/current/static/hstore.html kennt die Details. Wie gesagt, JSON(B) wäre auch noch eine Option. Aber da TEXT zu nehmen ist echt nicht der richtige Weg.

    Fragen? Fragen!
     
  5. JimGeoinf

    JimGeoinf Neuer Benutzer

    Hallo,

    danke für den Tipp! Habe es in hstore geändert.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden