VALUES ( expressão [, ...] ) [, ...] [ ORDER BY expressão_de_classificação [ ASC | DESC | USING operador ] [, ...] ] [ LIMIT { contador | ALL } ] [ OFFSET início ]
O comando VALUES computa um valor linha ou um conjunto de valores linha especificados por expressões de valor. É mais comumente utilizado para gerar uma "tabela constante" dentro de um comando maior, mas pode ser utilizado sozinho. [1]
Quando é especificada mais de uma linha, todas as linhas devem possuir o mesmo número de elementos. Os tipos de dado das colunas da tabela resultante são determinados pela combinação dos tipos explícitos ou inferidos das expressões que aparecem nesta coluna, utilizando as mesmas regras utilizadas para UNION (consulte a Seção 10.5).
Dentro de comandos maiores, VALUES é sintaticamente permitido em qualquer lugar onde o SELECT é permitido. Como é tratado como o SELECT pela gramática, é possível utilizar as cláusulas ORDER BY, LIMIT e OFFSET com o comando VALUES.
Uma constante ou expressão a ser computada e inserida no local indicado da tabela resultante (conjunto de linhas). Numa lista VALUES aparecendo no nível mais alto do comando INSERT, a expressão pode ser substituída por DEFAULT para indicar que deve ser inserido o valor padrão da coluna de destino. Não pode ser utilizado DEFAULT quando VALUES aparece em outro contexto.
Uma expressão ou constante inteira indicando como classificar as linhas do resultado. Esta expressão pode fazer referência às colunas do resultado de VALUES como column1, column2, etc. Para obter detalhes deve ser consultada a Cláusula ORDER BY.
O operador de classificação. Para obter detalhes deve ser consultada a Cláusula ORDER BY.
O número máximo de linhas a serem retornadas. Para obter detalhes deve ser consultada a Cláusula LIMIT.
O número de linhas a serem saltadas antes de começar a retornar as linhas. Para obter detalhes deve ser consultada a Cláusula LIMIT.
Listas VALUES com um número muito grande de linhas devem ser evitadas, uma vez que pode ocorrer falha devido à falta de memória ou o desempenho ser prejudicado. VALUES aparecendo dentro do comando INSERT é um caso especial, porque os tipos de dado desejados para as colunas são conhecidos a partir da tabela de destino do INSERT, não precisando ser inferidos varrendo a lista do VALUES. Por isso pode tratar listas maiores do que as que seriam possíveis em outros contextos.
Um comando VALUES puro:
VALUES (1, 'um'), (2, 'dois'), (3, 'três'); column1 | column2 ---------+--------- 1 | um 2 | dois 3 | três (3 linhas)
O comando acima retorna uma tabela com duas colunas e três linhas. Na realidade é equivalente ao comando:
SELECT 1 AS column1, 'um' AS column2 UNION ALL SELECT 2, 'dois' UNION ALL SELECT 3, 'três'; column1 | column2 ---------+--------- 1 | um 2 | dois 3 | três (3 linhas)
Normalmente VALUES é utilizado dentro de um comando SQL maior. O uso mais comum é no comando INSERT:
INSERT INTO filmes (cod, titulo, id_dist, data_prod, tipo) VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');
No contexto do comando INSERT, as entradas da lista do VALUES podem ser DEFAULT para indicar que deve ser utilizado nesta posição o valor padrão da coluna, em vez de um valor especificado:
INSERT INTO filmes VALUES ('UA502', 'Bananas', 105, DEFAULT, 'Comédia', '82 minutes'), ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);
VALUES também pode ser utilizado onde um sub-SELECT poderia ser escrito como, por exemplo, na cláusula FROM:
SELECT f.* FROM filmes f, (VALUES('MGM', 'Horror'), ('UA', 'Sci-Fi')) AS t (estudio, tipo) WHERE f.estudio = t.estudio AND f.tipo = t.tipo; UPDATE empregados SET salario = salario * v.aumento FROM (VALUES(1, 200000, 1.2), (2, 400000, 1.4)) AS v (num_dep, destino, aumento) WHERE empregados.num_dep = v.num_dep AND empregados.vendas >= v.destino;
Deve ser observado que a cláusula AS é requerida quando VALUES é utilizado na cláusula FROM, como é verdade para o comando SELECT. Não é requerido que a cláusula AS especifique nomes para todas as colunas, mas é boa prática fazer isto (Os nomes padrão das colunas de VALUES são column1, column2, etc. no PostgreSQL, mas estes nomes podem ser diferentes em outros sistemas de banco de dados).
Quando VALUES é utilizado no comando INSERT, os valores são todos convertidos automaticamente para o tipo de dado da coluna de destino correspondente. Quando é utilizado em outros contextos, pode ser necessário especificar o tipo de dado correto. Se as entradas forem todas constantes literais entre apóstrofos, a conversão da primeira é suficiente para determinar o tipo assumido para todas:
SELECT * FROM maquinas WHERE ip_address IN (VALUES('192.168.0.1'::inet), ('192.168.0.10'), ('192.168.1.43'));
Dica: Para testes simples do IN, é melhor depender da forma com lista de escalares do IN do que escrever o comando VALUES conforme mostrado acima. O método da lista de escalares requer menos escrita, e geralmente é mais eficiente.
O comando VALUES está em conformidade com o padrão SQL, exceto por LIMIT e OFFSET que são extensões do PostgreSQL.
[1] |
DB2 — O comando VALUES é uma forma de consulta. Pode ser incorporado a um programa aplicativo ou submetido interativamente. DB2 Version 9 for Linux, UNIX, and Windows (N. do T.) |