Spalte auslesen und in neue überführen

JimGeoinf

Neuer Benutzer
Beiträge
3
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
 
Werbung:
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 :) )
 
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!
 
Werbung:
Zurück
Oben