VALUES
Вычисляет набор строк.
Синтаксис
VALUES ( <expression> [, ...] ) [, ...]
[ORDER BY <sort_expression> [ ASC | DESC | USING <operator> ] [, ...] ]
[LIMIT { <count> | ALL } ]
[OFFSET <start> [ ROW | ROWS ] ]
[FETCH { FIRST | NEXT } [<count>] { ROW | ROWS } ONLY ]
Описание
VALUES вычисляет значение строки или набор значений строк, заданных выражениями. Чаще всего эта команда используется для формирования "таблицы констант" в рамках большой команды, но может использоваться и самостоятельно.
Если указывается более одной строки, все строки должны содержать одинаковое количество элементов. Типы данных столбцов результирующей таблицы определяются путем совмещения явных или предполагаемых типов выражений, указанных в этих столбцах, по тем же правилам, что и UNION.
В составе других команд синтаксис позволяет использовать VALUES везде, где используется SELECT. Поскольку грамматически она воспринимается как SELECT, с командой VALUES можно использовать выражения ORDER BY, LIMIT (или эквивалентное FETCH FIRST) и OFFSET.
Параметры
| Параметр | Описание |
|---|---|
expression |
Константа или выражение, которое вычисляется и вставляется в указанное место результирующей таблицы (множества строк). В списке |
sort_expression |
Выражение или целочисленная константа, указывающие, как сортировать строки результата. Это выражение может ссылаться на столбцы результата |
operator |
Оператор сортировки. За более подробной информацией обратитесь к разделу Выражение ORDER BY в описании |
LIMIT <count> OFFSET <start> |
Максимальное число строк, которое должно быть возвращено. За более подробной информацией обратитесь к разделу Выражение LIMIT в описании |
Примечания
Следует избегать списков VALUES с очень большим количеством строк, так как это может привести к ошибкам нехватки памяти или снижению производительности. Применение VALUES внутри команды INSERT — особый случай (поскольку ожидаемые типы столбцов известны из целевой таблицы команды INSERT и не требуют определения путем сканирования списка VALUES), так что в этом контексте можно работать со списками большего размера, чем это возможно в других контекстах.
Примеры
Простая команда VALUES:
VALUES (1, 'one'),
(2, 'two'),
(3, 'three');
Эта команда выдает таблицу из двух столбцов и трех строк. По сути она равнозначна запросу:
SELECT 1 AS column1, 'one' AS column2
UNION ALL
SELECT 2, 'two'
UNION ALL
SELECT 3, 'three';
Чаще всего VALUES используется в составе большей команды SQL. Наиболее распространенное применение — в команде INSERT:
INSERT INTO films (code, title, did, date_prod, kind)
VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
В контексте INSERT в списке VALUES можно указать ключевое слово DEFAULT, указывающее на то, что для столбца следует использовать значение по умолчанию вместо некоторого значения:
INSERT INTO films
VALUES ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'),
('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);
VALUES также можно использовать там, где может быть написан подзапрос SELECT, например, в выражении FROM:
SELECT f.*
FROM films f,
(VALUES ('MGM', 'Horror'), ('UA', 'Sci-Fi')) AS t (studio, kind)
WHERE f.studio = t.studio
AND f.kind = t.kind;
UPDATE employees
SET salary = salary * v.increase
FROM (VALUES (1, 200000, 1.2), (2, 400000, 1.4)) AS v (depno, target, increase)
WHERE employees.depno = v.depno
AND employees.sales >= v.target;
Обратите внимание, что при использовании VALUES в выражении FROM требуется AS, как и в случае с SELECT. Указывать имена всех столбцов в выражении AS не обязательно, но рекомендуется. По умолчанию Greengage DB дает столбцам VALUES имена column1, column2 и т.д., но в других системах баз данных эти имена могут быть другими.
При использовании VALUES в команде INSERT все значения автоматически приводятся к типу данных соответствующего целевого столбца. В других контекстах может потребоваться указать нужный тип данных. Если все записи представляют собой строковые константы в кавычках, то приведения первой из них достаточно для определения нужного типа для всех:
SELECT *
FROM machines
WHERE ip_address IN (VALUES ('192.168.0.1'::inet), ('192.168.0.10'), ('192.0.2.43'));
Для простых проверок на включение IN лучше использовать форму IN в виде списка скаляров, чем писать запрос VALUES, как показано выше. Список скаляров проще записать, и обрабатывается он зачастую более эффективно.
Совместимость
VALUES соответствует стандарту SQL. LIMIT и OFFSET являются расширениями Greengage DB; см. также SELECT.