[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-postgresql-kak-rabotat-s-massivami-v-postgresql":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},936,"kak-rabotat-s-massivami-v-postgresql",28,"postgresql","PostgreSQL","🐘","Как работать с массивами в PostgreSQL?","PostgreSQL позволяет хранить массивы значений любого типа в одном поле. Массивы удобны для небольших списков тегов и меток, которые читаются целиком, но для сложных связей лучше использовать отдельную таблицу.\n\n```sql\nCREATE TABLE products (\n    id serial PRIMARY KEY,\n    name text,\n    tags text[],\n    prices numeric[]\n);\n\nINSERT INTO products (name, tags, prices) VALUES\n('Кредит наличными', ARRAY['кредит', 'физлица', 'наличные'], ARRAY[100000, 500000, 1000000]),\n('Вклад \"Надёжный\"', '{вклад,физлица,депозит}', '{50000,100000}');\n```\n\n\u003Cdetails>\u003Csummary>Операции с массивами\u003C\u002Fsummary>\n\n```sql\n-- Доступ к элементу (индексация с 1!)\nSELECT tags[1] FROM products;  -- 'кредит'\n\n-- Срез массива\nSELECT tags[1:2] FROM products;  -- {'кредит','физлица'}\n\n-- Проверка вхождения элемента\nSELECT * FROM products WHERE 'кредит' = ANY(tags);\nSELECT * FROM products WHERE tags @> ARRAY['кредит'];\n\n-- Проверка пересечения массивов\nSELECT * FROM products WHERE tags && ARRAY['вклад', 'кредит'];  -- overlap\n\n-- Конкатенация\nSELECT tags || ARRAY['новый_тег'] FROM products;\nSELECT array_append(tags, 'новый_тег') FROM products;\n\n-- Удаление элемента\nSELECT array_remove(tags, 'физлица') FROM products;\n\n-- Длина массива\nSELECT array_length(tags, 1) FROM products;\n\n-- Разворачивание массива в строки\nSELECT unnest(tags) AS tag FROM products;\n\n-- Агрегация в массив\nSELECT array_agg(name) FROM products WHERE 'физлица' = ANY(tags);\n```\n\n\u003C\u002Fdetails>\n\n### Индексирование массивов\n\n```sql\n-- GIN-индекс для поиска по массивам\nCREATE INDEX idx_products_tags ON products USING GIN (tags);\n\n-- После создания индекса эффективно работают: @>, &&, \u003C@\nSELECT * FROM products WHERE tags @> ARRAY['кредит', 'физлица'];\n```\n\n### Когда массивы, а когда отдельная таблица\n\n- **Массивы** — для небольших списков тегов\u002Fметок, которые в основном читаются целиком\n- **Отдельная таблица (many-to-many)** — если нужны JOIN, агрегации, FOREIGN KEY, или если массивы большие\n\n> **На собеседовании:** индексация массивов в PostgreSQL начинается с 1, а не с 0 — классический вопрос-ловушка. Также стоит упомянуть, что для поиска по массивам нужен GIN-индекс, а не B-tree.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Как работать с массивами в PostgreSQL? — Gymterview","PostgreSQL позволяет хранить массивы значений любого типа в одном поле. Массивы удобны для небольших списков тегов и меток, которые читаются целиком, но для сло","PostgreSQL позволяет хранить массивы значений любого типа в одном поле. Массивы удобны для небольших списков тегов и мет",[7,13],"PostgreSQL позволяет хранить массивы значений любого типа в одном поле. Массивы удобны для небольших списков тегов и меток, которые читаются целиком, но для сложных связей лучше использовать отдельную таблицу.",true]