Categorias:

Sintaxe de consulta

VALUES

Na instrução SELECT, a subcláusula VALUES da cláusula FROM permite especificar um conjunto de constantes para formar um conjunto finito de linhas.

Para obter mais informações sobre a cláusula VALUES na instrução INSERT, consulte a documentação da instrução INSERT.

Sintaxe

SELECT ...
FROM ( VALUES ( <expr> [ , <expr> [ , ... ] ] ) [ , ( ... ) ] )
  [ [ AS ] <table_alias> [ ( <column_alias> [ , ... ] ) ] ]
[ ... ]

Parâmetros

expr

Cada expressão deve ser uma constante, ou uma expressão que possa ser avaliada como uma constante durante a compilação da instrução SQL.

A maioria das expressões aritméticas simples e funções de string podem ser avaliadas no tempo de compilação, mas a maioria das outras expressões não podem.

table_alias

Um alias opcional para dar um nome ao conjunto de linhas, como se o conjunto de linhas fosse uma tabela.

column_alias

Os aliases opcionais podem especificar os nomes das colunas.

Notas de uso

  • Dentro de uma cláusula FROM, uma cláusula VALUES não pode conter a palavra-chave DEFAULT. Esta limitação contrasta com uma cláusula VALUES em uma instrução INSERT, que oferece suporte ao uso de DEFAULT. Por exemplo, INSERT INTO table VALUES (10, DEFAULT, 'Name') ....

  • Quando uma cláusula VALUES inclui vários valores de diferentes tipos de dados para a mesma coluna, o Snowflake determina um tipo de dados comum que pode abranger todos os valores e converte implicitamente cada valor para esse tipo comum. Essa conversão pode produzir resultados inesperados ou erros se você não estiver ciente dela.

    Para evitar coerção inesperada, defina explicitamente cada valor como CAST para o tipo desejado, separe os valores em várias instruções SQL ou certifique-se de que todos os valores em uma coluna compartilhem o mesmo tipo.

    Exemplo numérico

    Quando os valores numéricos na mesma coluna diferem significativamente em escala ou precisão, o Snowflake pode retornar um erro out of range porque um valor não se encaixa no tipo numérico comum determinado.

    SELECT column1 FROM VALUES
      (3.469446951953614e-18),
      (115898.73);
    
    100039 (22003): Numeric value '115898.73' is out of range
    

    Especificamente para valores numéricos, você também pode especificar valores como cadeias de caracteres de texto entre aspas e, em seguida, convertê-los em valores numéricos conforme necessário.

    Exemplo de carimbo de data/hora

    Quando valores de carimbo de data/hora de diferentes tipos aparecem na mesma coluna, o Snowflake converte todos os valores para um tipo de carimbo de data/hora comum. No exemplo a seguir, um valor TIMESTAMP_NTZ é convertido para TIMESTAMP_LTZ:

    SELECT $1 AS a, SYSTEM$TYPEOF(a) FROM VALUES
      (TO_TIMESTAMP_LTZ('2025-03-24 01:37:00 -0700')),
      (TO_TIMESTAMP_NTZ('2025-03-24 08:37:00'));
    
    +-------------------------------+------------------+
    | A                             | SYSTEM$TYPEOF(A) |
    |-------------------------------+------------------|
    | 2025-03-24 01:37:00.000 -0700 | TIMESTAMP_LTZ(9) |
    | 2025-03-24 08:37:00.000 -0700 | TIMESTAMP_LTZ(9) |
    +-------------------------------+------------------+
    
  • A cláusula VALUES é limitada a 200.000 linhas.

Exemplos

Os exemplos a seguir usam a cláusula VALUES para gerar um conjunto fixo e conhecido de linhas:

SELECT * FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
+---------+---------+
| COLUMN1 | COLUMN2 |
|---------+---------|
|       1 | one     |
|       2 | two     |
|       3 | three   |
+---------+---------+

É possível referenciar valores pelo nome da coluna (implícito) ou pela posição da coluna. O exemplo a seguir faz referência à segunda coluna por posição de coluna:

SELECT column1, $2 FROM (VALUES (1, 'one'), (2, 'two'), (3, 'three'));
+---------+-------+
| COLUMN1 | $2    |
|---------+-------|
|       1 | one   |
|       2 | two   |
|       3 | three |
+---------+-------+

O exemplo a seguir distingue várias cláusulas VALUES usando aliases:

SELECT v1.$2, v2.$2
  FROM (VALUES (1, 'one'), (2, 'two')) AS v1
        INNER JOIN (VALUES (1, 'One'), (3, 'three')) AS v2
  WHERE v2.$1 = v1.$1;

Você também pode especificar aliases para os nomes das colunas, conforme mostrado no exemplo a seguir:

SELECT c1, c2
  FROM (VALUES (1, 'one'), (2, 'two')) AS v1 (c1, c2);