2016-10-06 99 views
0

我正试图在postgresql中实现访问函数'isnull'这个函数将一个表达式作为参数,如果null已经传递,函数返回true;如果它不为null,则返回false。我知道postgres有'IS NULL'和'NOT NULL'关键字在我将字符串或空值本身传递给函数时,我不断收到多态错误,因为它们都是未知类型。检查是否有元素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(文本)'具有相同的身体。它应该解决问题。 – Abelisto

回答

1

如果定义这两个函数,它将为所有情况:

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在空值方面有一个非常愚蠢的错误,但对他们来说,它“按预期工作”。 – coladict

+0

@coladict:那会是什么“愚蠢的错误”? –

+0

每个null都必须有一个数据类型,或者它们相应的内部数据类型必须有一个注册的转换器函数,它可以检查Oid for Unknown类型,然后才能检查它是否为空。如果该转换不存在(因为xml与整数不相同),则不能将一种类型的SQL NULL转换为另一种类型的NULL。并非所有类型都有来自未知的转换。 – coladict