Tenho uma tabela no Snowflake que se parece com isso:
+------+------+------+------------------------------------------------------------------+
| Col1 | Col2 | Col3 | Col4 |
+------+------+------+------------------------------------------------------------------+
| 1 | foo | 32 | [{"id":"1", "category":"black"}] |
| 2 | bar | 22 | [{"id":"1", "category":"black"}, {"id":"4", "category":"white"}] |
| 3 | smeg | 2 | null |
+------+------+------+------------------------------------------------------------------+
Gostaria de transformar os dados em outra tabela parecida com esta:
+------+------+------+------+----------+
| Col1 | Col2 | Col3 | id | category |
+------+------+------+------+----------+
| 1 | foo | 32 | 1 | black |
| 2 | bar | 22 | 1 | black |
| 2 | bar | 22 | 4 | white |
| 3 | smeg | 2 | null | null |
+------+------+------+------+----------+
Já fiz isso no SQL Server antes de usar JSON_VALUE
o e OPENJSON
, mas estou com dificuldades para encontrar um equivalente no Snowflake.
Uma correção para a resposta acima: Nulos precisam ser explicitamente tratados para categoria.
O achatamento lateral sozinho não consideraria NULLs, você pode usar
OUTER => TRUE
ou usarUNION
com condiçãoWHERE Col4 IS NULL
.Documentação EXTERNA
Saída
No Snowflake, você pode conseguir isso usando a
FLATTEN
função, que é projetada para manipular dados semiestruturados como arrays JSON. Esta função pode expandir o array armazenado dentro de uma coluna em várias linhas.Você também usará
OBJECT_GET
para extrair campos específicos do objeto JSON.Veja como você pode obter a transformação desejada no Snowflake:
Consulta SQL:
Explicação:
FLATTEN(input => t.Col4)
: Esta função nivela a matriz JSON emCol4
linhas separadas, onde cada objeto JSON na matriz se torna uma linha separada.f.value:id::STRING
: Isso extrai oid
campo do objeto JSON, garantindo que ele seja convertido em uma string.f.value:category::STRING
: Isso extrai ocategory
campo do objeto JSON, garantindo que ele seja convertido em uma string.LATERAL
: Isso é usado para permitir que aFLATTEN
função produza linhas para cada item na matriz JSON.Resultado:
Isso lhe dará a saída no formato desejado:
Manipulando Nulos:
null
emCol4
, como visto na terceira linha,FLATTEN
retornaránull
valores paraid
ecategory
, que é o que você deseja.Este método lida eficientemente com a expansão da string JSON e a extração dos campos necessários no Snowflake. Me avise se precisar de mais esclarecimentos!