VALUES

VALUES — computa um conjunto de valores de linha

Sinopse

VALUES ( expressão [, ...] ) [, ...]
    [ ORDER BY expressao_de_ordenação
        [ ASC | DESC | USING operador ]
        [, ...]
    ]
    [ LIMIT { contador | ALL } ]
    [ OFFSET início [ ROW | ROWS ] ]
    [ FETCH { FIRST | NEXT } [ contador ]
        { ROW | ROWS }
        ONLY
    ]

Descrição

O comando VALUES computa um valor de linha, ou um conjunto de valores de linha, especificados por expressões de valor. É mais comumente usado para gerar uma tabela constante em um comando maior, mas pode ser usado sozinho.

Quando é especificada mais de uma linha, todas as linhas devem ter o mesmo número de elementos. Os tipos de dados das colunas da tabela resultante são determinados pela combinação dos tipos explícitos ou inferidos das expressões que aparecem na coluna, usando as mesmas regras da cláusula UNION (veja UNION, CASE e construções relacionadas).

Dentro de comandos maiores, VALUES é sintaticamente permitido em qualquer lugar onde o SELECT é permitido. Por ser tratado pela gramática como um SELECT, é possível usar as cláusulas ORDER BY, LIMIT (ou de forma equivalente, FETCH FIRST), e OFFSET no comando VALUES.

Parâmetros

expressão

Uma constante, ou expressão calculada, a ser inserida no local indicado na tabela resultante (conjunto de linhas). Em uma lista VALUES no nível superior de um 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 usado DEFAULT quando VALUES aparece em outros contextos.

expressao_de_ordenação

Uma expressão, ou constante inteira, indicando como ordenar as linhas do resultado. Esta expressão pode se referir às colunas do resultado de VALUES como column1, column2, etc. Para obter mais detalhes, veja a Cláusula ORDER BY na documentação do SELECT.

operador

O operador de ordenação. Para obter mais detalhes, veja a Cláusula ORDER BY na documentação do SELECT.

contador

O número máximo de linhas a serem retornadas. Para obter mais detalhes, veja a Cláusula LIMIT na documentação do SELECT.

início

O número de linhas a serem saltadas antes de começar a retornar linhas. Para obter mais detalhes, veja a Cláusula LIMIT na documentação do SELECT.

Notas

Deve-se evitar listas VALUES com um número muito grande de linhas, porque podem acontecer falhas de memória insuficiente ou baixo desempenho. Quando VALUES aparece no comando INSERT, isto é um caso especial (porque os tipos de dados das colunas são conhecidos pela tabela de destino do INSERT, não precisando ser inferidos pela verificação da lista de VALUES), portanto, é possível lidar com listas maiores do que em outros contextos.

Exemplos

Um comando VALUES simples:

VALUES (1, 'um'), (2, 'dois'), (3, 'três');

Retorna uma tabela de duas colunas e três linhas, equivalente a:

SELECT 1 AS column1, 'um' AS column2
UNION ALL
SELECT 2, 'dois'
UNION ALL
SELECT 3, 'três';

Geralmente, VALUES é usado em um comando SQL maior. O uso mais comum é no comando INSERT:

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

No contexto do comando INSERT, pode ser escrito DEFAULT nas entradas da lista de VALUES, para indicar que deve ser usado o valor padrão da coluna nesta posição, em vez de especificar um valor:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'),
    ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama', DEFAULT);

VALUES também pode ser usado onde um sub-SELECT pode ser escrito, por exemplo em uma 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;

Note que a cláusula AS é necessária quando VALUES é usado em uma cláusula FROM, assim como seria para um SELECT. Não é necessário que a cláusula AS especifique nomes para todas as colunas, mas é uma boa prática fazê-lo. (Os nomes de coluna padrão para VALUES são column1, column2, etc., no PostgreSQL, mas estes nomes podem ser diferentes em outros sistemas de banco de dados.)

Quando VALUES é usado em um comando INSERT, os valores são todos convertidos automaticamente para o tipo de dados da coluna de destino correspondente. Quando usado em outros contextos, pode ser necessário especificar o tipo de dados correto. Se todas as entradas forem constantes cadeia de caracteres entre apóstrofos, converter a primeira é suficiente para determinar o tipo de dados assumido para todas:

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

Dica

Para testes IN simples, é melhor confiar na forma lista-de-valores do IN, do que escrever uma consulta usando VALUES como mostrado acima. O método da lista de valores é mais conciso, e geralmente mais eficiente.

Exemplo 88. Exemplo do tradutor

Este exemplo usa um bloco de código anônimo para mostrar a atribuição da data e hora corrente a uma variável usando o comando VALUES INTO [162].

DO $$
DECLARE
    agora TIMESTAMP;
BEGIN
    VALUES (CURRENT_TIMESTAMP) INTO agora;
    RAISE NOTICE 'Data e hora: %', agora;
END $$ LANGUAGE plpgsql;
NOTA:  Data e hora: 2026-03-25 09:50:10.94829
DO

Conformidade

VALUES está em conformidade com o padrão SQL. LIMIT e OFFSET são extensões do PostgreSQL; veja também o comando SELECT.

Veja também

INSERT, SELECT


[162] O comando VALUES INTO produz uma tabela de resultados que consiste em no máximo uma linha, e atribui os valores dessa linha a variáveis do hospedeiro. IBM DB2 12.1.x – VALUES INTO statement (N. T.)