如何测试Postgresql数组字段是否为空或为空数组的正确方法?

6
我有一个定义了integer_array字段的表格。它包含以下数据:
 id | black_list 
----+------------
  4 |            
  5 |            
  8 |            
 12 |            
  6 |            
  7 |            
 10 | {5}        
 13 | {5}        
  3 | {}         
  9 | {3}        
 11 | {}         
 14 | {}         
  1 | {}         
  2 | {}         
 15 | {}         
 16 | {}         
 17 | {}         
(17 rows)

我需要编写一个查询来查看数组字段是否为空 - NULL或其他。问题在于{}值既不为空,也不返回任何ARRAY_LENGTH函数的长度。由http://www.postgresql.org/docs/8.4/static/functions-array.html列出的其他数组函数似乎也不是我所需的。我发现我可以编写ARRAY_LENGTH(0 || black_list)以便让它们全部返回1或更多的长度,但那似乎是一个可怕的技巧。有没有正确的方法来测试这个问题呢?

奖励问题:究竟{}代表什么?我无法编写一个选择语句来返回该值。 ARRAY[]会抛出错误,ARRAY[""]返回{""}ARRAY[NULL]返回{NULL},等等。


我意识到我可以编写反向代码并测试长度是否大于0,但我想知道为什么似乎没有一种方法可以这样测试; - Chris Bloom
{} 似乎表示一个空数组,这可以解释为什么该值不为空(NOT NULL),而 ARRAY_LENGTH({}) 不返回任何内容——尽管我期望它在 {} 上返回 0,也许这是我不熟悉的 PostgreSQL 特性。你不能测试一下 ARRAY_LENGTH 的返回值吗?例如 'SELECT id FROM table WHERE ARRAY_LENGTH(black_list) IS NULL OR ARRAY_LENGTH(black_list) < 1'。假设 ARRAY_LENGTH() 不会对上面示例中 id=12 的空值失去控制,那么这似乎就能解决问题了。 - Aaron Miller
我现在手头上没有可用的PostgreSQL服务器进行测试,因此我之前的评论中的查询语句未经过测试。如果我让您走错路,请原谅。 - Aaron Miller
是的,实际上 ARRAY_LENGTH(provider_black_list, 1) IS NULL 运行得非常好。感谢您的建议。 - Chris Bloom
当然可以!我会把它翻译成答案。 - Aaron Miller
1个回答

7

{} 似乎表示一个空数组,这可以解释为什么值是 NOT NULL,并且 ARRAY_LENGTH({}) 没有返回任何内容 - 尽管我期望它在 {} 上返回 0,也许这是我不熟悉的 PostgreSQL 特殊性。

你为什么不能测试 ARRAY_LENGTH 的返回值呢,例如:

SELECT id FROM table WHERE ARRAY_LENGTH(black_list, 1) IS NULL OR ARRAY_LENGTH(black_list, 1) < 1

假设像上面例子中的id=12那样的空值不会干扰ARRAY_LENGTH()函数,那么似乎就可以解决问题。

它成功了!这并不是我的预期方式,但简化了我的上一个查询,读起来很好。 - Chris Bloom
顺便提一下 - ARRAY_LENGTH(black_list, 1) IS NULL 可以正确地测试空的 {} 值和 NULL 值,因此无需额外测试 < 1 - Chris Bloom
我必须像答案中那样使用“IS NULL”。当我尝试“= NULL”时,它不起作用。很奇怪,但你的方法有效 :) - itsols
@itsols 这是因为测试任何东西,包括 NULL 是否等于 NULL 都会返回 NULL。我不知道为什么会这样,但了解这一点仍然很有价值。 - Aaron Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接