ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Ajuda com IIF ou Case no Firebird?

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Seg Set 09, 2019 4:23 pm    Assunto: Ajuda com IIF ou Case no Firebird? Responder com Citação

Preciso saber como fazer esta logica aqui, tentei com os doi métodos que conheco e quando cai na segunda opção vem zerado
Código:
SELECT
  IIF(cidade.cidade_cep <> '', cidade.cidade_cep, endereco.endereco_cep) as cep1,
  CASE
  WHEN cidade.cidade_cep <> '' then
      cidade.cidade_cep
  ELSE
    endereco.endereco_cep
  END AS cep,



O select que montei completo
Código:
SELECT
  IIF(cidade.cidade_cep <> '', cidade.cidade_cep, endereco.endereco_cep) as cep1,
  CASE
  WHEN cidade.cidade_cep <> '' then
      cidade.cidade_cep
  ELSE
    endereco.endereco_cep
  END AS cep,
  endereco.endereco_logradouro,
  endereco.endereco_complemento,
  bairro.bairro_descricao,
  cidade.cidade_descricao,
  UF.uf_sigla
FROM CIDADE
LEFT join uf ON uf.uf_codigo = cidade.uf_codigo
LEFT join bairro ON bairro.cidade_codigo = cidade.cidade_codigo
LEFT join endereco ON endereco.bairro_codigo = bairro.bairro_codigo

WHERE
-- (upper(uf.uf_sigla) like :pbusca)

--000 OR
  (endereco.endereco_cep = :pbusca
      or cidade.cidade_cep = :pbusca)

 or (upper(bairro.bairro_descricao) like :pbusca)

 or (upper(cidade.cidade_descricao) like :pbusca)

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Seg Set 09, 2019 9:12 pm    Assunto: Responder com Citação

Boa noite,

Pelo que entendi do seu código, tanto com o IIF como com o Case, se a coluna cidade_cep estiver em branco é retornada a coluna endereco_cep, mas pelo menos na teoria acho que pode acontecer da coluna endereco_cep também não estar preenchida ou ainda de não existir um registro relacionado já que estão sendos utilizados Left Joins.

Espero que ajude


Editado pela última vez por imex em Dom Out 01, 2023 5:39 pm, num total de 2 vezes
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Set 10, 2019 11:19 am    Assunto: Responder com Citação

imex escreveu:
Boa noite,

Pelo que entendi do seu código, tanto com o IIF como com o Case, se a coluna cidade_cep estiver em branco é retornada a coluna endereco_cep, mas pelo menos na teoria acho que pode acontecer da coluna endereco_cep também não estar preenchida ou ainda de não existir um registro relacionado já que estão sendos utilizados Left Joins.

Espero que ajude


Bom dia, estava colocando errado em vez de '' tem que ser 0 ai deu certo Imex.

Outra coisa tem como consultar ou por um ou por outro campo no mesmo parametro?

Assim ta dando erro
Código:
SELECT
  IIF(cidade.cidade_cep <> 0, cidade.cidade_cep, endereco.endereco_cep) as cep1,
 /*$$IBEC$$  CASE
  WHEN cidade.cidade_cep <> '' then
      cidade.cidade_cep
  ELSE
    endereco.endereco_cep
  END AS cep, $$IBEC$$*/
  endereco.endereco_logradouro,
  endereco.endereco_complemento,
  bairro.bairro_descricao,
  cidade.cidade_descricao,
  UF.uf_sigla
FROM CIDADE
LEFT join uf ON uf.uf_codigo = cidade.uf_codigo
LEFT join bairro ON bairro.cidade_codigo = cidade.cidade_codigo
LEFT join endereco ON endereco.bairro_codigo = bairro.bairro_codigo

WHERE
 (endereco.endereco_cep = :pbusca
      or cidade.cidade_cep = :pbusca)
 or (upper(uf.uf_sigla) like :pbusca)
 or (upper(bairro.bairro_descricao) like :pbusca)
 or (upper(cidade.cidade_descricao) like :pbusca)
 or (upper(endereco.endereco_logradouro) like :pbusca
     or upper(endereco.endereco_logradouro) like :pbusca )


arithmetic exception, numeric overflow, or string truncation, string rigth truncation
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Set 10, 2019 11:42 am    Assunto: Responder com Citação

Bom dia,

O erro está ocorrendo com o campo CEP? Esse campo é numérico?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Set 10, 2019 11:50 am    Assunto: Responder com Citação

imex escreveu:
Bom dia,

O erro está ocorrendo com o campo CEP? Esse campo é numérico?


Não o campo é varchar 8

Queria ver se tem como pesquisar por estes campos, todos que vi são varchar, somente o tamanho é diferente
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Set 10, 2019 12:01 pm    Assunto: Responder com Citação

Acho que se o campo é varchar o zero deveria estar entre aspas na condição do IIF ou do Case.

Você tem certeza que esse erro está ocorrendo no Where?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Set 10, 2019 1:47 pm    Assunto: Responder com Citação

imex escreveu:
Acho que se o campo é varchar o zero deveria estar entre aspas na condição do IIF ou do Case.

Você tem certeza que esse erro está ocorrendo no Where?



Assim veja no parametro digitei %CAMPO%

O Select com UF
Código:
SELECT
  IIF((cidade.cidade_cep <> '0') and (cidade.cidade_cep <> ''), cidade.cidade_cep, endereco.endereco_cep) as cep1,
 /*$$IBEC$$  CASE
  WHEN cidade.cidade_cep <> '' then
      cidade.cidade_cep
  ELSE
    endereco.endereco_cep
  END AS cep, $$IBEC$$*/
  endereco.endereco_logradouro,
  endereco.endereco_complemento,
  bairro.bairro_descricao,
  cidade.cidade_descricao,
  UF.uf_sigla
FROM CIDADE
LEFT join uf ON uf.uf_codigo = cidade.uf_codigo
LEFT join bairro ON bairro.cidade_codigo = cidade.cidade_codigo
LEFT join endereco ON endereco.bairro_codigo = bairro.bairro_codigo

WHERE
 (endereco.endereco_cep = :pbusca
      or cidade.cidade_cep = :pbusca)
 or (upper(uf.uf_sigla) like :pbusca)
 or (upper(bairro.bairro_descricao) like :pbusca)
 or (upper(cidade.cidade_descricao) like :pbusca)
 --or (upper(endereco.endereco_logradouro) like :pbusca
 --    or upper(endereco.endereco_logradouro) like :pbusca )


Da o erro
arithmetic exception, numeric overflow, or string truncation, string rigth truncation
Se eu comento o campo
or (upper(uf.uf_sigla) like :pbusca)
Traz o resultado no select

Mais neste mesmo select com o UF comentado aonde digitei %CAMPO% se eu alterar para %CAMPO M% novamente da o erro
arithmetic exception, numeric overflow, or string truncation, string rigth truncation
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Set 10, 2019 2:16 pm    Assunto: Responder com Citação

Desconfio que esse erro está ocorrendo quando o parâmetro possui mais caracteres que o tamanho do campo. Se o problema for esse mesmo, acho que uma alternativa seria limitar o tamanho do parâmetro ao tamanho do campo, apesar que isso pode afetar o resultado obtido. Ex:

Código:
or (upper(uf.uf_sigla) like left(:pbusca, 2))


Outra alternativa seria utilizar um Cast ou Convert para aumentar o tamanho do campo antes de comparar, mas isso pode afetar um pouco o desempenho. Ex:

Código:
or (upper(cast(uf.uf_sigla as varchar(50))) like :pbusca)


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Set 10, 2019 2:33 pm    Assunto: Responder com Citação

imex escreveu:
Desconfio que esse erro está ocorrendo quando o parâmetro possui mais caracteres que o tamanho do campo. Se o problema for esse mesmo, acho que uma alternativa seria limitar o tamanho do parâmetro ao tamanho do campo, apesar que isso pode afetar o resultado obtido. Ex:

Código:
or (upper(uf.uf_sigla) like left(:pbusca, 2))


Outra alternativa seria utilizar um Cast ou Convert para aumentar o tamanho do campo antes de comparar, mas isso pode afetar um pouco o desempenho. Ex:

Código:
or (upper(cast(uf.uf_sigla as varchar(50))) like :pbusca)


Espero que ajude


Deste jeito aqui
Código:
SELECT
  IIF((cidade.cidade_cep <> '0') and (cidade.cidade_cep <> ''), cidade.cidade_cep, endereco.endereco_cep) as cep1,
 /*$$IBEC$$  CASE
  WHEN cidade.cidade_cep <> '' then
      cidade.cidade_cep
  ELSE
    endereco.endereco_cep
  END AS cep, $$IBEC$$*/
  endereco.endereco_logradouro,
  endereco.endereco_complemento,
  bairro.bairro_descricao,
  cidade.cidade_descricao,
  UF.uf_sigla
FROM CIDADE
LEFT join uf ON uf.uf_codigo = cidade.uf_codigo
LEFT join bairro ON bairro.cidade_codigo = cidade.cidade_codigo
LEFT join endereco ON endereco.bairro_codigo = bairro.bairro_codigo

WHERE
 ((CAST(endereco.endereco_cep AS VARCHAR(50)) = :pbusca)
      or (CAST(cidade.cidade_cep as VARCHAR(50)) = :pbusca))
 or
   (upper(cast(uf.uf_sigla as varchar(50))) = :pbusca)
 or (upper(cast(bairro.bairro_descricao as varchar(50))) like :pbusca)
 or (upper(cast(cidade.cidade_descricao as varchar(50))) like :pbusca)
 --or (upper(endereco.endereco_logradouro) like :pbusca
 --    or upper(endereco.endereco_logradouro) like :pbusca )


Se eu digitar %CURITIBA% Me trouxe uma lista no CAMPO BAIRRO_DESCRICAO
JARDIM CURITIBA da cidade de GOIANIA-GO
Porém ao navegar na lsuta ele chega um momento que da o erro novamente.
arithmetic exception, numeric overflow, or string truncation, string rigth truncation


Ja o problema no UF se eu digitar PR ele me traz o result do Paraná.

Desta forma
Código:
or (upper(uf.uf_sigla) like left(:pbusca, 2))

Meu firebird não reconheceu.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Set 10, 2019 3:25 pm    Assunto: Responder com Citação

Esse erro ao navegar pelo resultado ocorre no IBExpert ou outra ferramenta semelhante?
Sobre a função Left, ela foi adicionada a partir da versão 2.1. Se você estiver utilizando uma versão mais antiga pode experimentar essa outra versão com a função Substring. Ex:

Código:
or (upper(uf.uf_sigla) like substring(:pbusca from 1 for 2))


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Ter Set 10, 2019 3:51 pm    Assunto: Responder com Citação

imex escreveu:
Esse erro ao navegar pelo resultado ocorre no IBExpert ou outra ferramenta semelhante?
Sobre a função Left, ela foi adicionada a partir da versão 2.1. Se você estiver utilizando uma versão mais antiga pode experimentar essa outra versão com a função Substring. Ex:

Código:
or (upper(uf.uf_sigla) like substring(:pbusca from 1 for 2))


Espero que ajude


Estou executando no ibexpert
Meu firebird 2.5

Assim funcionou
Código:
or (upper(uf.uf_sigla) like substring(:pbusca from 1 for 2))
, mais ainda estou com o erro de arithmetic exception, numeric overflow, or string truncation, string rigth truncation

Acho que vou separar este select ai, pode estar sendo interpretado como algo confuso pelo select.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB