Select com Case e Coalesce não está funcionando
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.
Mas este abaixo funciona
select case id_tecnico when null then coalesce(max(id_tecnico),0+1) end chave from staff_tecnico group by id_tecnico
select coalesce(max(id_tecnico),0+1)chave from staff_tecnico
Pjava
Curtidas 0
Respostas
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
talvez o que você queira seja isso:
select coalesce(max(id_tecnico),0)+1 chave from staff_tecnico
GOSTEI 0
Pjava
03/01/2011
Continua retornando NULL. Se retirar o case funciona, como eu falei.
GOSTEI 0
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
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
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
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
decode(id_tecnico, null,(select max(id_tecnico) + 1 from staff_tecnic), id_tecnico) id_tecnico
from staff_tecnic
GOSTEI 0
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
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.
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
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.
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