VALUES#

VALUES

VALUES

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 (см. Раздел 10.5).

В рамках более крупных команд, VALUES синтаксически допускается в любом месте, где допускается SELECT. Поскольку он обрабатывается как SELECT с точки зрения грамматики, возможно использование ORDER BY, LIMIT (или эквивалентно FETCH FIRST), и OFFSET секции с командой VALUES.

Параметры

expression

Константа или выражение для вычисления и вставки в указанное место в результирующей таблице (наборе строк). В списке VALUES, появляющемся на верхнем уровне INSERT, expression может быть заменено на DEFAULT, чтобы указать, что должно быть вставлено значение по умолчанию для столбца назначения. DEFAULT не может использоваться, когда VALUES появляется в других контекстах.

sort_expression

Выражение или целочисленная константа, указывающая, как сортировать строки результата. Это выражение может ссылаться на столбцы результата VALUES как column1, column2 и т.д. Дополнительные сведения см. в разделе ORDER BY Clause документации по SELECT.

operator

Оператор сортировки. Подробности см. в документации по ORDER BY Clause в разделе SELECT.

count

Максимальное количество строк для возврата. Подробности см. в документации по LIMIT Clause в разделе SELECT.

start

Количество строк, которые нужно пропустить перед началом возврата строк. Подробности см. в разделе LIMIT Clause документации по 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 в Tantor BE - column1, column2 и т. д., но эти имена могут отличаться в других системах баз данных).

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

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

Подсказка

Для простых тестов IN лучше полагаться на форму списка скаляров IN, чем писать запрос VALUES, как показано выше. Метод списка скаляров требует меньше написания и часто более эффективен.

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

VALUES соответствует стандарту SQL. LIMIT и OFFSET являются расширениями Tantor BE; см. также раздел SELECT.

См. также

INSERT, SELECT