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> [ , ... ] ) ] ]
[ ... ]
Copy

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 a cláusula VALUES inclui vários valores numéricos para a mesma coluna, e os valores diferem significativamente em escala ou precisão, o Snowflake pode retornar um erro out of range. O erro pode ser retornado mesmo que cada valor individual não resulte em um erro para o tipo de dados da coluna de destino.

    O erro ocorre porque o Snowflake determina um tipo de dados numérico comum que pode abranger todos os literais numéricos fornecidos em uma cláusula VALUES, e alguns valores podem estar fora do intervalo para o tipo de dados comum determinado.

    Por exemplo, a seguinte instrução retorna um erro out of range:

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

    Você pode evitar esse tipo de erro fazendo as seguintes mudanças:

    • Separe os valores na cláusula VALUES em várias instruções SQL.

    • Converta valores em um tipo de dados com um intervalo mais amplo de valores, como FLOAT. Entretanto, a conversão pode resultar em menor precisão numérica.

    • Especifique os valores como strings de texto entre aspas e, em seguida, converta os valores em valores numéricos, conforme necessário.

  • A cláusula VALUES é limitada a 16.384 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'));
Copy
+---------+---------+
| 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'));
Copy
+---------+-------+
| 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;
Copy

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