Fórum Select com Case e Coalesce não está funcionando #393278

03/01/2011

0

Este select não funciona e preciso fazer com Case, pois em alguns clientes a tabela estará vazia e preciso do coalesce e em outros não, por isso o case, se for NULL faz o coalesce e se não, faz a soma(incremento) sozinho.
select
  case id_tecnico
  when null then
    coalesce(max(id_tecnico),0+1)
  end chave
from staff_tecnico
group by id_tecnico
  Mas este abaixo funciona
select coalesce(max(id_tecnico),0+1)chave from staff_tecnico
Pjava

Pjava

Responder

Posts

04/01/2011

Emerson Nascimento

o que é esse 0+1 ???? porque não coloca somente 1 ???

talvez o que você queira seja isso:

select coalesce(max(id_tecnico),0)+1 chave from staff_tecnico




Responder

Gostei + 0

04/01/2011

Pjava

Continua retornando NULL. Se retirar o case funciona, como eu falei.
Responder

Gostei + 0

05/01/2011

Emerson Nascimento

Continua retornando NULL. Se retirar o case funciona, como eu falei.


case???? que case ???

não tem case na instrução que eu te passei.

select coalesce(max(id_tecnico),0)+1 chave from staff_tecnico
Responder

Gostei + 0

05/01/2011

Pjava

Kra, esse select eu também passei no início. Eu preciso é de um case, pois pode ser que em determinado cliente eu tenha esse campo NULL(recem criada as tabelas) e em outros clientes eu os tenha já preechidos. Essa instrução é disparada de dentro de uma aplicação Delphi. Ela faz um case para saber se o campo é null ou não, para só depois pegar o valor da chave. Caso for NULL, faço o coalesce e se não for faço o incremento normalmente. 
Responder

Gostei + 0

05/01/2011

Deivison Melo

qual sua versão do firebird?   Se estiver utilizando a partir da versão 2.1 vc pode utilizar o decode.    
Responder

Gostei + 0

05/01/2011

Deivison Melo

Desculpe esqueci de adicionar o exemplo:   select
  decode(id_tecnico, null,(select max(id_tecnico) + 1 from staff_tecnic), id_tecnico) id_tecnico
  from staff_tecnic
Responder

Gostei + 0

05/01/2011

Emerson Nascimento

Kra, esse select eu também passei no início. Eu preciso é de um case, pois pode ser que em determinado cliente eu tenha esse campo NULL(recem criada as tabelas) e em outros clientes eu os tenha já preechidos. Essa instrução é disparada de dentro de uma aplicação Delphi. Ela faz um case para saber se o campo é null ou não, para só depois pegar o valor da chave. Caso for NULL, faço o coalesce e se não for faço o incremento normalmente. 


Paulo, você executou a instrução que eu te passei?
Ela faz exatamente o que você está precisando. copie daqui e cole no IBExpert, por exemplo.

select coalesce(max(id_tecnico),0)+1 chave from staff_tecnico

note que a minha instrução é diferente da sua. são muito parecidas e você pode pensar que é a mesma, mas não é.

Responder

Gostei + 0

05/01/2011

Pjava

Emerson, o meu exemplo também funciona. Mas ele só funciona para campos NULL e quando o campo não for null, aí eu não posso usar esse exemplo, teria que fazer tipo:

select max(id_tecnico) + 1 from staff_tecnico

Por isso eu preciso de um Case ou IF, para testar se aquela tabela, daquele cliente, esse campo é NULL ou não. Ele será NULL quando o cliente for novo. Aí a pessoa ao cadastrar pela primeira vez, a minha função feita em Delphi, vai fazer uma verificação(Com CASE), gerar a chave e inserir no banco com o novo valor. Essa é a razão do CASE, ou seja, ou uso um select ou uso outro.
Responder

Gostei + 0

06/01/2011

Emerson Nascimento

Deixa eu ver se eu entendi.

Você tem uma tabela de onde você precisa obter o maior ID e gerar um novo acrescentando 1 ao ID encontrado.
O problema é que esse tabela pode estar vazia e o valor retornado pela MAX() seria um NULL.

É isso?

Se for isso, a instrução que eu te passei faz exatamente o que você quer.

Então preciso te fazer uma pergunta: VOCÊ TESTOU A INSTRUÇÃO QUE EU TE PASSEI? OU APENAS ACHA QUE ELA NÃO FUNCIONA ?

select coalesce(max(id_tecnico),0)+1 chave from staff_tecnico



Explicando cada trecho da instrução

select coalesce(max(id_tecnico),0)+1 chave from staff_tecnico

o trecho em vermelho traz o maior ID da tabela staff_tecnico
o trecho em azul indica que se o valor obtido pela função MAX() for um NULL, ele assumirá o valor zero.
o trecho em verde indica que deverá ser somado 1 ao valor obtido.

acho que é exatamente disso que você precisa.



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar