2016-10-06 168 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