2017-11-30 4 views
2

classificatorテーブルのlookup_type値を使用して、値を適切な型にキャストしようとしています。plpgsqlで変数をフィールド型として使用する方法は?

        Table "public.classificator" 
     Column  | Type | Collation | Nullable |     Default     
------------------+--------+-----------+----------+------------------------------------------- 
classificator_id | bigint |   | not null | nextval('classificator_id_seq'::regclass) 
classificator | text |   | not null | 
lookup   | text |   | not null | 
description  | text |   |   | 
lookup_value  | text |   |   | 
lookup_type  | text |   |   | 

私は例の値のために使用します( 'SYSTEM_SETTINGS' は、 'ブール' '真' 'システムやないため夏時間を使用してください' 'daylight_saving_enabled')。

変数として変数を使用しているときに問題が発生しています。

psqlのテスト:

私はplpgsqlがでこれをやろうとしているとして
select cast('1' as integer); --> OK 

select cast('1' as 'integer'); 
ERROR: syntax error at or near "'integer'" 

、私は2つのオプションがあり、どのようにこの問題を解決するには:

1)

EXECUTE 'SELECT CAST($1 AS ' || 'boolean' || ')' 
    INTO value                
USING 'true'; 

2)キャストされた値を返すifsがたくさんある関数を作成する IF type = 'boolean' THEN return 'value'::booleanなど

この問題の解決策はありますか?

+0

を、関数が、なんとかではありません:) – user1190411

+0

来る他の人の回答者へ:ダウンしないでください。 "おそらくあなたはレコードを返す関数を持つことができるかもしれない..." - そのような関数の出力を使うときは、とにかくキャストを指定しなければならないことを覚えておいてから、私はそれを覚えていました。 – Scoots

答えて

1

あなたの解決策1)はほとんどが正しいものです。

私はそれに優雅な解決策はないと思います。

はそれが書き、セキュアにするために:それは、特定の戻り値の型を持たなければならないように、第2の思想に

EXECUTE format('SELECT CAST($1 AS %I)', 'bool') 
    INTO value                
    USING 'true'; 
+0

私は、anyelementを使ってタイプモーフィング関数を簡単に調べましたが、変数で生成できないregtypeとして2番目の要素を供給する必要がありました:)これはもう一つのデッドエンドです。 – user1190411

+0

Pgはフォーマットの一般的なタイプを好まないと思われます。ブール値をboolに変更し、smallintをint2に変更しなければならなかったので、フォーマットは正常でした。 – user1190411

+0

ありがとうございました。 –

関連する問題