2016-06-19 10 views
0

既存のpostgresql enumデータ型から値を削除しようとしています。私の研究では、私が望まない値を除いて列挙型を再作成する必要があることがわかります。これを達成するための私の考えはサブクエリの値を選択し、postgresqlの列挙型に保存

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

を経由して、既存のデータ型からすべての値を取得し、私が欲しい、これらの値を取り、何とか新しいデータ型

そうにそれらを挿入することがあります私の質問:サブクエリから値を取得し、クエリ結果から列挙型を作成することは可能ですか?これを行うより良い方法はありますか?

私もこのような試みをしましたが、select enum_rangeから値を除外する方法を理解できません。

あなたは、関数や DOブロック内の例を動的問合せをexceuteする必要が

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

答えて

1

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) 

読み取りについて:


使用したクエリについての注意事項。

select enum_range(null::fruits) 

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

我々はformat()でパラメータとして使用する文字列'apple','banana'に結果を変換したいです。最後に

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

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

、文字列に配列を変換:

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) 

、次

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

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

を要素を引用して、配列にそれらを集約: まず、リストから'pear'を削除

しかし、もっと簡単に行う必要があります。

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

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

ありがとう、私の良い先生。優れた作品!あなたの答えを説明するかもしれないドキュメンテーションに私を指摘できますか? – NoToBagels

関連する問題