web-dev-qa-db-ja.com

列挙型のpg_typeを定期的にクエリするのは悪い習慣ですか?

Postgresでは、クエリpg_typeは、私が定期的に使用している列挙の最新のリストを表示します。私はこのようなものを使用しています:

SELECT pg_type.typname AS enum_type, pg_enum.enumlabel AS enmu_label FROM 
pg_type JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid;

または

SELECT distinct pg_type.typname AS enum_type FROM pg_type JOIN pg_enum ON 
pg_enum.enumtypid = pg_type.oid;

これは悪い習慣ですか?

3
1N5818

これは悪い習慣ですか?

いいえ、まったくありません。カタログを変更することは悪い習慣ですが、クエリしない理由はありません。

しかし、クエリでは…

SELECT distinct pg_type.typname AS enum_type FROM pg_type JOIN pg_enum ON pg_enum.enumtypid = pg_type.oid;

…参加する必要はありませんpg_enumおよびdistinctを使用:

create type mood as enum ('sad', 'ok', 'happy');
select * from pg_enum;
列挙型| enumsortorder | enumlabel 
:----- :------------ | :-------- 
 53430 | 1 |悲しい
 53430 | 2 |わかりました
 53430 | 3 |幸せ
select typname from pg_type where typtype='e';
 | typname | 
 | :------ | 
 |気分| 

dbfiddle ---(ここ

@ジャックは言った 。さらに、必要なのが列挙型の登録された値のリストである場合、いくつかの 列挙サポート関数 それを行うには。ジャックの例に基づいて:

SELECT enum_range(null::mood);

enum_range
--------------
{sad,ok,happy}

これは、クエリを壊す可能性のあるPostgresの将来の主要なバージョンでの(ありそうもない)変更に対してよりシンプルで回復力があります。

dbfiddle ここ

5