不返回PL / pgSQL返回查询null类型

时间:2014-08-08 15:53:32

标签: postgresql null

我在PL / pgSQL函数中有以下声明:

RETURN QUERY SELECT pd.* FROM  "PushDevice" pd
        WHERE pd."PushNotificationId" =$4 and pd."sentAt" is null;

PushDevice表现在有一个名为sentAt的列。如果是null,那么我得到一个如下所示的返回查询:

(A,B,C ,, d)。

sentAt不为null但它看起来像一个空字符串(甚至没有添加)。当列的值为null时,是否可以使返回的查询返回NULL而不是空?这非常重要,因为我在NHibernate中的底层结构需要一些与空字段相对的东西。

我环顾四周,最接近答案的是使用合并但是没有用作字符串+ null = string。 null + null = null。

编辑:

重申我的问题。我的查询是正确的,我的查询返回的结果也是正确的。但是,如果表PushDevice的类型为timestamp的sendAt列为null,则postgres不会返回NULL,而是返回一个空字段。

其中a,b,c,d,e是字段,d是发送的字段,我会得到(a,b,c,e)。 postgres将省略d,当字段为null时,我需要让它返回null。

2 个答案:

答案 0 :(得分:1)

您正在自由地混合术语“NULL”,“空字符串”和“无”。你需要在这里非常清楚。

这是错误的: string + null = string
添加或连接到任何内容的NULL 总是 NULL。

对于类型timestamp,正如您所阐明的:这不能是“空字符串”。只有字符数据可以是空字符串('')。你看到了什么(没有),你的客户端中的文本表示为NULL。数据类型timestamp只能包含有效值或NULL。 (有一些特殊的输入值,如infinity or -infinity or allballs(原文如此!)。

如果要将NULL值显示为不同的字符串,则需要将timestamp转换为text(或类似),并相应地更改函数的RETURN类型。

RETURN QUERY
SELECT  a, b, c, COALESCE("sentAt"::text, '<NULL>') AS "sentAt"
FROM   "PushDevice"
WHERE  "PushNotificationId" = $4
AND    "sentAt" IS NULL;

答案 1 :(得分:1)

什么是空场?

postgres=# CREATE TABLE f1(a int, b int, c int);
CREATE TABLE
postgres=# INSERT INTO f1 VALUES(10,NULL, 20);
INSERT 0 1

CREATE OR REPLACE FUNCTION public.fx_f1()
 RETURNS SETOF f1
 LANGUAGE plpgsql
AS $function$
BEGIN
  RETURN QUERY SELECT * FROM f1;
  RETURN;
END;
$function$

postgres=# select fx_f1();
  fx_f1   
----------
 (10,,20)
(1 row)

postgres=# select (fx_f1()).b IS NULL;
 ?column? 
----------
 t
(1 row)

postgres=# \pset null <NULL>
Null display is "<NULL>".

-- it doesn't work as expected, result is record, not table
postgres=# select fx_f1();
  fx_f1   
----------
 (10,,20)
(1 row)

-- fx is correct
postgres=# select * from fx_f1();
 a  |   b    | c  
----+--------+----
 10 | <NULL> | 20
(1 row)

您的问题可能是您客户的问题。尝试使用SELECT FROM而不是SELECT。