2013-03-25 79 views
4

我有一個用integer_array字段定義的表。它包含以下數據:什麼是測試Postgresql數組字段爲空還是空的正確方法

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或更長的長度,但這看起來像是一個討厭的黑客。什麼是測試這個的正確方法?

獎勵問題:究竟是什麼{}代表?我一直無法編寫一個將返回該值的select語句。 ARRAY[]引發錯誤,ARRAY[""]回報{""}ARRAY[NULL]回報{NULL}

+0

我意識到我可以只寫一個逆,並測試一下長度是否大於0,但我想知道爲什麼似乎沒有這種方式來測試它; – 2013-03-25 20:31:08

+0

{}似乎代表一個空數組,它可以解釋值爲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這樣的空值不會失去它的想法,那麼看起來這樣做會有所斬獲。 – 2013-03-25 20:36:22

+0

(我現在還沒有Postgre服務器方便測試,因此在我以前的評論中沒有經過測試的查詢,對不起,如果我把你送到了一個盲人的小巷。) – 2013-03-25 20:36:53

回答

4

{}似乎代表了一個空數組,這可以解釋兩者的價值是NOT NULLARRAY_LENGTH({})不返回任何東西 - 雖然我希望它返回0在{},也許這是我不熟悉的PostgreSQL特性。

是否有一個原因,您不能只測試ARRAY_LENGTH的返回值,例如,

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

假設ARRAY_LENGTH()不會失去其心中對如在上面的例子中id=12空值,好像是會做的伎倆。

+0

它的工作原理!根本不是我所期望的,所以簡化了我以前的查詢並且讀得很好。 – 2013-03-26 13:24:00

+0

順便說一句,'ARRAY_LENGTH(black_list,1)IS NULL'既可以針對空的{}值也可以針對NULL值進行正確測試,因此無需另外測試<1>。 – 2013-03-26 13:26:36

+0

我必須在答案中使用'IS NULL'。當我嘗試'= NULL'它不起作用。奇怪,但你的方法:) – itsols 2013-10-23 07:24:35

相關問題