2016-06-19 10 views
0

Ich versuche, einen Wert aus einem vorhandenen postgresql Enum-Datentyp zu entfernen. Meine Nachforschungen sagen mir, dass ich den Enum-Datentyp mit Ausnahme des Werts, den ich nicht möchte, neu erstellen muss. Meine Idee um dies zu erreichen ist es, alle Werte aus dem vorhandenen Datentyp erhalten überUnterabfrage Werte auswählen und in Enumeration in PostgreSQL speichern

select e.enumlabel as enum_value from pg_type t join pg_enum e on t.oid = e.enumtypid
join pg_catalog.pg_namespace n ON n.oid = t.typnamespace where t.typname = 'alert_level' where e.enumlabel is not 'value i want to exclude'

create type alert_type2 as enum ('ABOVE QUERY HERE') ::alert_type

und diese Werte nehmen ich will, und sie irgendwie in einen neuen Datentyp

So legen meine Frage: Ist es möglich, Werte von einer Unterabfrage zu erhalten und einen Enum-Datentyp aus den Abfrageergebnissen zu erstellen? Gibt es einen besseren Weg, dies zu tun?

Ich habe auch so etwas versucht, aber ich kann nicht herausfinden, wie man Werte aus dem Select enum_range ausschließt.

create type alert_type2 as enum (select enum_range(NULL::alert_type)::text)

Antwort

1

Sie haben eine dynamische Abfrage innerhalb einer Funktion exceute oder DO Block, Beispiel:

create type fruits as enum ('apple', 'pear', 'banana'); 

do $$ 
begin 
    execute format(
     'create type fruits_without_pear as enum (%s)', 
     (
      select array_to_string(array_agg(quote_literal(e)), ',') 
      from unnest(enum_range(null::fruits)) e 
      where e <> 'pear' 
     ) 
    ); 
end $$; 

select enum_range(null::fruits_without_pear); 

    enum_range 
---------------- 
{apple,banana} 
(1 row) 

Lesen Sie mehr über:


Hinweise zu verwendeten Abfrage.

select enum_range(null::fruits) 

    enum_range  
--------------------- 
{apple,pear,banana} 
(1 row) 

Wir wollen 'apple','banana' das Ergebnis an die Zeichenfolge verwandeln sie als Parameter in format() zu verwenden. Zuerst entfernen 'pear' aus der Liste:

select e 
from unnest(enum_range(null::fruits)) e 
where e <> 'pear'; 

    e  
-------- 
apple 
banana 
(2 rows) 

Als nächstes werden die Elemente zitieren und sie in einem Array zusammenfassen:

select array_agg(quote_literal(e)) 
from unnest(enum_range(null::fruits)) e 
where e <> 'pear' 

    array_agg  
-------------------- 
{'apple','banana'} 
(1 row) 

schließlich ein Array String verwandeln:

select array_to_string(array_agg(quote_literal(e)), ',') 
from unnest(enum_range(null::fruits)) e 
where e <> 'pear' 

array_to_string 
------------------ 
'apple','banana' 
(1 row) 

Allerdings hätten wir es etwas einfacher machen sollen;)

select string_agg(quote_literal(e), ',') 
from unnest(enum_range(null::fruits)) e 
where e <> 'pear' 

array_to_string 
------------------ 
'apple','banana' 
(1 row) 
+0

Vielen Dank mein guter Herr. Funktioniert hervorragend! Können Sie mir auf irgendeine Dokumentation verweisen, die Ihre Antwort erklären könnte? – NoToBagels

Verwandte Themen