2013-03-25 2 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, но я хотел бы знать, почему, похоже, нет способа проверить ее таким образом; –

+0

{} представляется пустым массивом, который объясняет, что значение NOT NULL и ARRAY_LENGTH ({}) ничего не возвращает, хотя я ожидаю, что он вернет 0 на {}, возможно, это особенность PostgreSQL, с которой Я незнакома. Есть ли причина, по которой вы не можете просто проверить возвращаемое значение ARRAY_LENGTH, например. 'SELECT id FROM table WHERE ARRAY_LENGTH (black_list) IS NULL ИЛИ ARRAY_LENGTH (black_list) <1'? Предполагая, что ARRAY_LENGTH() не потеряет рассудок о пустых значениях, таких как id = 12 в приведенном выше примере, похоже, что это сделало бы трюк. –

+0

(У меня нет сервера Postgre на данный момент, чтобы протестировать его, следовательно, непроверенный запрос в моем предыдущем комментарии. Извините, если я отправил вас в тупик.) –

ответ

4

{}, кажется, представляет собой пустой массив, который бы объяснить как значение быть 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 

Предполагая, что ARRAY_LENGTH() не теряет ум на пустые значения, такие, как, что для id=12 в приведенном выше примере, похоже, что бы сделать трюк.

+0

Он работает! Совсем не так, как бы я ожидал этого, упростил мой предыдущий запрос и хорошо прочитал. –

+0

BTW - 'ARRAY_LENGTH (black_list, 1) IS NULL' корректно проверяет как пустые значения' {} 'так и значения NULL, так что нет необходимости тестировать для' <1'. –

+0

Я хотел использовать 'IS NULL', как в ответе. Когда я попробовал «= NULL», это не сработало. Странно, но ваш метод работает :) – itsols

Смежные вопросы