Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

erro no union

A query a seguir esta dando erro e não estou sabendo corrigir, o erro é: ERROR: invalid input syntax for type date: "NULL"

o que poderia ser para eu trabalhar melhor essa consulta?

select 

ft.sk_atividade,
ft.id_atividade,
ft.nome_atividade,
ft.duracao_estimada,
ft.tipo_atividade,
ft.situacao,
ft.data_fim_estimada,
ft.data_solicitacao::date,
ft.porcentual_conclusao,
ft.data_conclusao_real,
ft.prioridade,
ft.solicitado_por,
ft.data_inicio,
ft.duracao_real,
ft.data_conclusao::date,
ft.sk_data_criacao,
ft.sk_usuario,
null as sistema,
s.nome_setor

from ft_atividades ft
left join dim_aux_atividade_setor a on a.sk_atividade = ft.sk_atividade 
left join dim_setores s on s.sk_setor = a.sk_setor

UNION ALL

select

ft.sk_registro as sk_atividade,
ft.id_tarefa as id_atividade,
ft.servico as nome_atividade,
null as duracao_estimada,
servico as tipo_atividade,
UPPER(ft.status) as situacao,
null as data_fim_estimada,
t.dtc_data as data_solicitacao,
CASE
    WHEN sk_data_fechamento is null THEN 0
    ELSE 100
    END as percentual_conclusao,
tt.dtc_data as data_conclusao_real,
ft.prioridade,
ft.nome_solicitante as solicitado_por,
null as data_inicio,
null as duracao_real,
tt.dtc_data as data_conclusao,
ft.sk_data_criacao,
ft.sk_responsavel as sk_usuario,
ft.sistema,
ft.setor

from ft_tarefas_clickup ft
left join dim_tempo t on t.sk_tempo = ft.sk_data_criacao
left join dim_tempo tt on tt.sk_tempo = ft.sk_data_fechamento
2 respostas

Oi, Luiz! Tudo bom?

A mensagem de erro que você compartilhou geralmente acontece quando tentamos converter um valor NULL para um tipo date. No entanto, o PostgreSQL não permite essa conversão, visto que um dado NULL (que representa a ausência de valor) não pode ser transformado em data.

Um caminho possível para contornar este problema é usar a função COALESCE. Ela, neste contexto, substituirá o valor NULL por uma determinada data. No exemplo abaixo, essa troca foi feita considerando a data atual.

COALESCE(ft.data_solicitacao::date, CURRENT_DATE)

Portanto, se ft.data_solicitacao for NULL, a função COALESCE retornará a data de hoje (atual). Caso não queira usar a data atual como valor padrão, é possível substituir CURRENT_DATE por qualquer outra data, como "1900-01-01"!

Trago, também, uma outra dica bem bacana: utilizar a estrutura CASE-WHEN, que analisará os valores presentes em determinada coluna e, dependendo do resultado, tomará uma decisão diferente. Veja:

CASE
    WHEN ft.data_solicitacao IS NULL THEN NULL
    ELSE ft.data_solicitacao::date
END as data_solicitacao,

Na parte superior da sua consulta, onde são organizadas as colunas das tabelas, você pode escrever o código acima. Caso ft.data_solicitacao seja NULL, mantemos esse valor; caso contrário, o formatamos para o padrão de data.

Uma sugestão final é observar em suas tabelas como o valor NULL está sendo expresso. Caso ele esteja entre aspas ("NULL"), sugiro que você as retire.

Luiz, espero que dê tudo certo! Vale ressaltar que como é um assunto externo ao curso e que não tenho acesso ao cenário completo do projeto, outros testes terão de ser feitos a fim de obter o resultado esperado, mas espero que esta resposta seja um bom ponto de partida para a resolução do seu problema!

Um abraço.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!
solução!

Muito obrigado, a solução com CASE resolveu meu problema.