2012-05-13 17 views
2

PostgreSQLで任意の型を返す関数を持たせる方法はありますか?任意の型を返すPostgreSQL関数

私は、PostgreSQL 9.2のJSONタイプのフィールドを取得して比較するためにPLV8を使用しようとしています。カウント・フィールドが< = 10ですが、フィールドが数値でない場合、それが失敗した場所を返す

CREATE or replace FUNCTION jn (j json, key any) RETURNS numeric 
LANGUAGE plv8 
IMMUTABLE 
AS $function$ 
    var ej = JSON.parse(j); 
    if (typeof ej != 'object') return NULL; 
    return JSON.stringify(ej[key]); 
$function$; 

SELECT * FROM things WHERE jn(data,'count') <= '10'; 

次作品。 jsonが保持する可能性のあるすべてのタイプのデータに対して特定の関数を作成する必要はありません。何らかの理由でデータ型を推測して暗黙的にキャストする方法はありますか?

はあなたがPolymorphic typesと機能を探しているように見えるHow do I query using fields inside the new PostgreSQL JSON datatype?

答えて

3

も参照してください。
タイプと最後の2つの例に関する上記セクションをthis sectionに読みます。

keyのパラメータと関数の出力の種類が一致する必要があります。これがあなたのケースでない場合は、おそらくtextを返して、関数の外の正しいタイプにキャストしてください。

私はこれがあなたのために仕事をすると思う:

CREATE or replace FUNCTION jn (j json, key anyelement) RETURNS anyelement 
LANGUAGE plv8 
IMMUTABLE 
AS $function$ 
    var ej = JSON.parse(j); 
    if (typeof ej != 'object') return NULL; 
    return JSON.stringify(ej[key]); 
$function$; 

私はこれをテストすることはできませんので、申し訳ありませんが、私の周り9.2サーバーを持っていません。


EDIT:

物事です - あなたが関数内で任意のキャストを実行することができます前に、それは最初に作成する必要があります。作成時に、関数の入力パラメータの型と戻り値の型は固定されています。これは、あなたが唯一の2の可能性持っていることを意味:あなたが関数から返されたく同じ型を有するkeyパラメータを持つことを強制されます

  • 使用anyelementタイプを、;
  • textを使用して、関数の外部にキャスト結果があります。

PLV8はまだanyelement種類をサポートしていませんので、あなたが実際にあなたのために仕事をするために、その上にPL/pgSQLの上のラッパー関数を作成することができます。

CREATE FUNCTION jn_wrap(jn varchar, key anyelement, OUT ret anyelement) 
    AS $js_wrap$ 
BEGIN 
    EXECUTE 'SELECT CAST(jn($1, $2) AS '||pg_typeof(key)||')' 
     USING jn, key INTO ret; 

    RETURN ; 
END; 
$js_wrap$ LANGUAGE plpgsql; 

私はそれがかもしれないと思うけど非常に典型的なことですが、keyのタイプは希望の戻りタイプとは異なります。

+0

ええ、「エラー:エラー:PL/v8関数が型anyelementを返すことができません」というエラーが発生しました。 –

+0

動的にキャストすることは可能ですか?それでタイプを検出し、それに応じてキャストしますか?私は事前にタイプを知らない。 –

関連する問題