Иллюстрированный самоучитель по PostgreSQL

Массивы

Выборка из полей-массивов

При выборке из поля-массива весь массив возвращается в формате константы, описанном в предыдущем разделе. В листинге 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)
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.