Массивы
Выборка из полей-массивов
При выборке из поля-массива весь массив возвращается в формате константы, описанном в предыдущем разделе. В листинге 7.20 команда SELECT выбирает все элементы массивов в поле books таблицы favorite_books.
Листинг 7.20. Выборка из полей-массивов.
booktown=# SELECT books FROM favorite_books; books {"The Hitchhiker's Guide to the Galaxy"} {"The Hobbit"."Kitten. Squared") (2 rows)
Хотя возможность выборки всего массива приносит несомненную пользу, на практике чаще требуется получить некоторое подмножество элементов. Для решения этой задачи необходимо познакомиться с такими новыми понятиями, как индексы элементов и срезы массивов.
Индексы элементов
Популярность массивов в значительной степени обусловлена тем фактом, что к отдельным элементам можно обращаться при помощи индексов – целых чисел, заключенных в скобки и описывающих позицию искомого элемента в массиве.
В отличие от таких языков программирования, как С, в PostgreSQL индексация в массивах начинается с 1, а не с 0. Так, в листинге 7.21 индекс [1] для поля books таблицы favorite_books описывает первый элемент массива. Обратите внимание: данные, возвращаемые запросом, не заключаются в кавычки или фигурные скобки. Это связано с тем, что отдельное текстовое значение должно возвращаться в виде одной текстовой константы, а не массива.
Листинг 7.21. Выборка отдельного элемента массива.
booktown=# SELECT books[l] FROM favorite_books: books The Hitchhiker's Guide to the Galaxy The Hobbit (2 rows)
При указании индекса несуществующего элемента массива выборка возвращает NULL. Обычно для обработки таких ситуаций используется конструкция IS NOT NULL. В листинге 7.22 приведены два запроса; первый возвращает две записи – для NULL и для названия книги. Второй запрос возвращает только название, а запись с NULL исключается из выборки в результате использования секции WHERE с проверкой условия NOT NULL.
Листинг 7.22. Предотвращение выборки NULL в массивах.
booktown=# SELECT books[2] FROM favorite_books; books Kitten. Squared (2 rows) booktown=# SELECT books[2] FROM favorite_books booktown-# WHERE books[2] IS NOT NULL; books Kitten. Squared (1 row)
При выборке из многомерного массива за исходным индексом перечисляются дополнительные индексы. В листинге 7.23 из таблицы favorite_authors, созданной в листинге 7.19, выбираются два элемента – имя автора и название книги.
Листинг 7.23. Выборка из многомерного массива.
booktown=# SELECT authors_and_titles[l][l] AS author, booktown-# authors_and_titles[l][2] AS title booktown-# FROM favorite authors; author I title J.R.R. Tolkien | The Silmarillion (1 row)