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. Поскольку синтаксически VALUES обрабатывается как SELECT, к нему можно применять предложения ORDER BY, LIMIT (или эквивалентное FETCH FIRST) и OFFSET.

Параметры

  • expression
    • Константа или выражение, которое вычисляется и вставляется в указанное место результирующей таблицы (набора строк). В списке VALUES на верхнем уровне команды INSERT выражение может быть заменено на DEFAULT, чтобы указать, что следует вставить значение по умолчанию для целевого столбца. Использование DEFAULT недопустимо, когда VALUES применяется в других контекстах.
  • sort_expression
    • Выражение или целочисленная константа, определяющая порядок сортировки строк результата. Это выражение может ссылаться на столбцы результата VALUES как column1, column2 и т.д. Более подробно см. раздел «Предложение ORDER BY» в описании параметров SELECT.
  • operator
    • Оператор сортировки. Более подробно см. раздел «Предложение ORDER BY» в описании параметров SELECT.
  • LIMIT count
  • OFFSET start
    • Максимальное количество возвращаемых строк. Более подробно см. раздел «Предложение LIMIT» в описании параметров SELECT.

Замечания

Следует избегать использования списков 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, однако это считается хорошей практикой. Имена столбцов по умолчанию для VALUES — column1, column2 и т.д. в Database, но в других системах управления базами данных они могут отличаться.

Когда VALUES используется в команде INSERT, все значения автоматически приводятся к типу данных соответствующего целевого столбца. При использовании в других контекстах может потребоваться явное указание нужного типа данных. Если все элементы представляют собой строковые литералы в кавычках, достаточно привести первый элемент, чтобы определить тип для всех:

SELECT * FROM machines WHERE ip_address IN 
(VALUES('192.168.0.1'::inet), ('192.168.0.10'), 
('192.0.2.43'));

Примечание!
Для простых проверок с помощью IN лучше использовать форму списка скалярных значений, а не записывать запрос через VALUES, как показано выше. Использование списка скаляров требует меньше кода и зачастую обеспечивает лучшую производительность.

Совместимость

VALUES соответствует стандарту SQL. LIMIT и OFFSET являются расширениями Database; дополнительную информацию см. в описании SELECT.

См. также INSERT, SELECT