VALUES

VALUES — calcula un conjunto de filas

Synopsis

VALUES ( expression [, ...] ) [, ...]
    [ ORDER BY sort_expression [ ASC | DESC | USING operator ] [, ...] ]
    [ LIMIT { count | ALL } ]
    [ OFFSET start [ ROW | ROWS ] ]
    [ FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } ONLY ]

Descripción

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.

Parámetros

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.

operator

Un operador de ordenamiento. Para más detalles, consulta la ORDER BY Clause en la documentación de SELECT.

count

El número máximo de filas a devolver. Para más detalles, consulta la LIMIT Clause en la documentación de SELECT.

start

El 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.

Notas

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.

Ejemplos

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'));

Tip

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.

Compatibilidad

VALUES cumple con el estándar SQL. LIMIT y OFFSET son PostgreSQL extensiones; consulta también bajo SELECT.

Véase también

INSERT, SELECT