Select com Case e Coalesce não está funcionando

Firebird

03/01/2011

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

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

03/01/2011

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




GOSTEI 0
Pjava

Pjava

03/01/2011

Continua retornando NULL. Se retirar o case funciona, como eu falei.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

03/01/2011

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
GOSTEI 0
Pjava

Pjava

03/01/2011

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. 
GOSTEI 0
Deivison Melo

Deivison Melo

03/01/2011

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

Deivison Melo

03/01/2011

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
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

03/01/2011

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 é.

GOSTEI 0
Pjava

Pjava

03/01/2011

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.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

03/01/2011

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.



GOSTEI 0
POSTAR