VALUES — calcula un conjunto de filas
VALUES (expression[, ...] ) [, ...] [ ORDER BYsort_expression[ ASC | DESC | USINGoperator] [, ...] ] [ LIMIT {count| ALL } ] [ OFFSETstart[ ROW | ROWS ] ] [ FETCH { FIRST | NEXT } [count] { ROW | ROWS } ONLY ]
VALUES calcula un valor de fila o conjunto de valores de fila
especificados por expresiones de valor. Se utiliza más comúnmente para generar una
“tabla constante” dentro de un comando más grande, pero se puede utilizar
por sí solo.
Cuando se especifica más de una fila, todas las filas deben tener el mismo número de
elementos. Los tipos de datos de las columnas de la tabla resultante se determinan combinando
los tipos explícitos o inferidos de las expresiones que aparecen en esa columna, utilizando
las mismas reglas que para UNION (consulta la Section 10.5).
Dentro de comandos más grandes, VALUES se permite sintácticamente en
cualquier lugar donde se permita SELECT. Debido a que la gramática lo trata
como un SELECT, es posible utilizar las cláusulas ORDER BY,
LIMIT (o equivalentemente FETCH FIRST) y OFFSET
con un comando VALUES.
expression
Una constante o expresión para calcular e insertar en el lugar indicado en la tabla resultante
(conjunto de filas). En una lista VALUES que aparece en el nivel superior de
un INSERT, una expression puede ser
reemplazada por DEFAULT para indicar que se debe insertar el valor por defecto
de la columna de destino. DEFAULT no se puede utilizar cuando VALUES
aparece en otros contextos.
sort_expression
Una expresión o constante entera que indica cómo ordenar las filas del resultado. Esta expresión
puede hacer referencia a las columnas del resultado de VALUES como column1,
column2, etc. Para más detalles, consulta la ORDER BY Clause en la
documentación de SELECT.
operatorUn operador de ordenamiento. Para más detalles, consulta la ORDER BY Clause en la documentación de SELECT.
countEl número máximo de filas a devolver. Para más detalles, consulta la LIMIT Clause en la documentación de SELECT.
startEl número de filas a omitir antes de comenzar a devolver filas. Para más detalles, consulta la LIMIT Clause en la documentación de SELECT.
Se deben evitar las listas VALUES con un número muy grande de filas, ya que podrías
encontrarte con fallas de falta de memoria o un rendimiento deficiente. VALUES
que aparece dentro de INSERT es un caso especial (porque los tipos de columna deseados
se conocen de la tabla de destino de INSERT y no necesitan inferirse escaneando la
lista VALUES), por lo que puede manejar listas más grandes que las que son prácticas
en otros contextos.
Un comando VALUES simple:
VALUES (1, 'one'), (2, 'two'), (3, 'three');
Esto devolverá una tabla de dos columnas y tres filas. Es efectivamente equivalente a:
SELECT 1 AS column1, 'one' AS column2 UNION ALL SELECT 2, 'two' UNION ALL SELECT 3, 'three';
Más habitualmente, VALUES se utiliza dentro de un comando SQL más grande. El uso
más común es en INSERT:
INSERT INTO films (code, title, did, date_prod, kind)
VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
En el contexto de INSERT, las entradas de una lista VALUES pueden
ser DEFAULT para indicar que se debe utilizar el valor por defecto de la columna en
lugar de especificar un valor:
INSERT INTO films VALUES
('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'),
('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);
VALUES también se puede usar donde se podría escribir una subconsulta SELECT,
por ejemplo en una cláusula 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;
Ten en cuenta que se requiere una cláusula AS cuando se utiliza VALUES
en una cláusula FROM, al igual que ocurre con SELECT. No se requiere
que la cláusula AS especifique nombres para todas las columnas, pero es una buena práctica
hacerlo. (Los nombres de columna por defecto para VALUES son column1,
column2, etc. en PostgreSQL, pero estos nombres pueden ser
diferentes en otros sistemas de bases de datos).
Cuando VALUES es utilizado en INSERT, todos los valores se convierten
automáticamente al tipo de datos de la columna de destino correspondiente. Cuando se utiliza en otros contextos,
puede ser necesario especificar el tipo de datos correcto. Si las entradas son todas constantes literales entre
comillas, convertir la primera es suficiente para determinar el tipo asumido para todas:
SELECT * FROM machines
WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.168.1.43'));
Para pruebas simples de tipo IN, es mejor confiar en la forma de
lista-de-escalares de IN que
escribir una consulta VALUES como se muestra arriba. El método de lista de escalares
requiere menos escritura y a menudo es más eficiente.
VALUES cumple con el estándar SQL.
LIMIT y OFFSET son
PostgreSQL extensiones; consulta también
bajo SELECT.