Массивы
Вставка значений в поля-массивы
В PostgreSQL предусмотрен специальный синтаксис вставки нескольких значений в одно поле. Этот синтаксис основан на определении массивов-констант. Как упоминалось в главе 3, массив-константа (предназначенный для ссылки на массивы PostgreSQL в командах SQL) состоит из фигурных скобок, апострофов и запятых, заключенных в апострофы. Кавычки нужны только при работе с массивами строк. Таким образом, обобщенная форма массива-константы выглядит так:
'{ "текст" [….] }' --массив строк '{ число [….]}' --числовой массив
В этих примерах использованы строковые и числовые массивы, но поле может определяться как массив произвольного типа (включая типы boolean, date и time). Как правило, если для описания величины в скалярном контексте должны использоваться апострофы (например, в строковых константах или данных типа timestamp), в контексте массива эта величина заключается в кавычки.
В листинге 7.18 в таблицу favorite_books вставляются две записи. Первая команда создает массив с одним элементом для работника с кодом 102, а вторая запись создает массив с двумя элементами для работника с кодом 103. В обеих командах INSERT используются массивы-константы.
Листинг 7.18. Вставка с использованием массивов-констант.
booktown=# INSERT INTO favorite_books VALUES booktown-# (102, '{"The HitchhikerVs Guide to the Galaxy"}'); INSERT 3628399 1 booktown=# INSERT INTO favorite_books VALUES booktown-# (103, '{"The Hobbit". "Kitten, Squared"}'); INSERT 3628400 1
Как видно из листинга, даже при вставке одного элемента массив заключается в фигурные скобки. Кроме того, обратите внимание, что апостроф в названии книги (первая команда INSERT) экранируется символом \, хотя и находится внутри кавычек. Это связано с тем, что массив-константа сначала обрабатывается как одна длинная строка, а затем интерпретируется как массив по контексту целевого поля.
При вставке значений в многомерный массив все подмассивы заключаются в отдельные фигурные скобки и разделяются запятыми. В листинге 7.19 приведен пример вставки одной записи с многомерным массивом-константой в таблицу favorite_authors, созданную в листинге 7.17.
Листинг 7.19. Вставка данных в многомерный массив.
booktown=# INSERT INTO favorite_authors booktown-# VALUES (102, booktown(# '{{"J.R.R. Tolkien". "The Silmarillion"}, booktown'# {"Charles Dickens", "Great Expectations"}, booktown'l {"Ariel Denham", "Attic Lives"}}'); INSERT 3727961 1
Многомерный массив в листинге 7.19 содержит три текстовых массива, каждый из которых состоит из двух элементов. Между массивами не существует никаких систематических связей, хотя из контекста следует, что первые элементы каждого массива обозначают авторов, а вторые элементы обозначают названия книг, написанных этими авторами.