2016-10-06 6 views
0

私はpostgresqlでアクセス関数 'isnull'を実装しようとしています。この関数はパラメータとして式をとり、関数はnullが渡された場合はtrueを返し、NULLでない場合はfalseを返します。私はpostgresが 'IS NULL'と 'NOT NULL'キーワードbuを持っていることを知っていますbu文字列またはnull値そのものを関数に渡すときに多変量エラーが発生し続けます。any要素があるかどうかを確認するISNULL [Postgresql]

この方法は、関数を使用して行う必要があります。私がこれまで持って何

CREATE OR REPLACE FUNCTION isnull(anyelement) RETURNS anyelement as $$ 
    BEGIN 
     IF $1 IS NULL THEN RETURN TRUE; 
     ELSE RETURN FALSE; 
     END IF; 
    END 
    $$LANGUAGE plpgsql; 
+1

「IS NULL」を使用してみませんか? –

+0

'isnull(anyelement)'関数に加えて、同じボディで 'isnull(text)'と宣言された別のものを作成します。問題を解決する必要があります。 – Abelisto

答えて

1

あなたはこの2つの関数を定義した場合、それはすべてのケースのために動作します:

CREATE OR REPLACE FUNCTION isnull(anyelement) RETURNS boolean 
    LANGUAGE sql IMMUTABLE AS 'SELECT $1 IS NULL'; 

CREATE OR REPLACE FUNCTION isnull(unknown) RETURNS boolean 
    LANGUAGE sql IMMUTABLE AS 'SELECT $1::text IS NULL'; 

追加の利点は、これらのようなSQL関数をインライン化することができるということです。

1

私はこれが

CREATE OR REPLACE FUNCTION isnull(anyelement) RETURNS boolean as $$ 
BEGIN 
    RETURN $1 IS NULL; 
END 
$$LANGUAGE plpgsql; 

テスト動作するようになった:

CREATE TEMP TABLE test(a int, b int); 
INSERT INTO test VALUES (1, null), (2, null); 
SELECT isnull(a), isnull(b) FROM test; 

は与える:

isnull | isnull 
--------+-------- 
f  | t 
f  | t 
+0

これはコンソールを介して動作しますが、CまたはJavaで準備されたステートメントでは機能しません。 PostgreSQLはnullになると非常にばかげたバグがありますが、それは "意図したとおりに動作しています"。 – coladict

+0

@coladict:それは "愚かなバグ"でしょうか? –

+0

すべてのNULLはデータ型を持たなければなりません。または、対応する内部データ型に、OidがUnknown型であるかどうかを確認する前に、Oid for Unknown型を持つ登録済みコンバータ関数が必要です。その変換が存在しない場合(おそらくxmlが整数と同じではないため)、あるタイプのSQL NULLを他のタイプのNULLに変換することはできません。すべての型が未知からの変換を持つわけではありません。 – coladict

関連する問題