零长度ROW(ROW())行为不端

时间:2018-03-15 12:05:30

标签: sql postgresql

我使用PostgreSQL 10.3。

以下陈述给出了相同的结果:true;

SELECT ROW() IS NULL;
SELECT ROW() IS NOT NULL;

和下一个

SELECT ROW() = ROW();

给出:

"ERROR: cannot compare rows of zero length"

因此,如果一行是零长度,那么它是未知未知还是两者

而且,我如何检查是否为零长度?

蒂亚

2 个答案:

答案 0 :(得分:0)

https://www.postgresql.org/docs/current/static/functions-comparison.html

  

如果表达式是行值,则行时IS NULL为真   表达式本身为null或当所有行的字段为空时,while   当行表达式本身为非null且全部为时,IS NOT NULL为true   行的字段为非null。由于这种行为,IS NULL和   IS NOT NULL并不总是返回行值的反向结果   表达式

关于告诉行属性计数的方法。我不确定如何做到整洁,但你可以想到很多猴子的方式,例如:

t=# SELECT count(1) from (select json_object_keys(row_to_json(ROW(1,2,3)))) a;
 count
-------
     3
(1 row)

t=# SELECT count(1) from (select json_object_keys(row_to_json(ROW()))) a;
 count
-------
     0
(1 row)

答案 1 :(得分:0)

PostgreSQL不允许比较零长度的行。

要检查行的大小,请尝试pg_column_size

CREATE TEMPORARY TABLE t (a TEXT, b TEXT);
INSERT INTO t VALUES ('foo','bar'),('foo','bar2');

SELECT pg_column_size(a)+pg_column_size(b) FROM t;

检查是否

SELECT pg_column_size(ROW())-24=0