我在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。
答案 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。