Fórum cláusula Where com parâmetros #56556

18/07/2006

0

preciso fazer a seguinte consulta:

select cod_cliente
from
  clientes
where (NOME_RAZAO = :Nome_Razao) and (NOME_FANTASIA = :Nome_Fantasia)


ou seja, se os dois parâmetros forem fornecidos é para procurar a combinação dos dois. Mas caso apenas um seja informado, é para procurar apenas os registros igual ao parâmetro informado e o outro campo seja igual a nulo.
[/code]


Raserafim

Raserafim

Responder

Posts

18/07/2006

Cabelo

Colega...

troque o and por or...

acredito que resolva o problema...


Responder

Gostei + 0

19/07/2006

Rodolpho123

Cara,
Essa qry não dá para ser montada em Run-Time? Se vc utlizar a cláusula [b:15a2232a17]or[/b:15a2232a17], o plano de execução da qry [b:15a2232a17]não[/b:15a2232a17] vai utlizar nenhum índice.


Responder

Gostei + 0

19/07/2006

Cabelo

Cara, Essa qry não dá para ser montada em Run-Time? Se vc utlizar a cláusula [b:838694794b]or[/b:838694794b], o plano de execução da qry [b:838694794b]não[/b:838694794b] vai utlizar nenhum índice.


Bom... primeiro que ´or´ não é uma cláusula... e sim um operador lógico...

segundo... PQ não vai utilizar um índice...???????????

não entendí... isso depende de como vc criar sua tabela...

se vc defineir o ídice como um doas campos, e depois outro índice com o outo campo irá funcionar perfeitamente.. 8)

Não vejo problemas...

Não entendí sua dúvida... entãos empre que usar o operador or não terei índice?????


Responder

Gostei + 0

20/07/2006

Raserafim

substituir o [b:9e34336c85]and[/b:9e34336c85] por [b:9e34336c85]or[/b:9e34336c85] não serve para a situação pelo seguinte motivo.

tenho um cadastro de clientes em que o nome que identifica o cliente é o composto da Razão Social juntamente com o Nome Fantasia. Ou seja, a concatenação dos dois campos é a identificação do cliente e portanto não podem se repetir.

ex: se em um registro estiver preenchido apenas a Razão Social, a pesquisa deverá localizar os registros que tb tem apenas a Razão Social preenchida e com o mesmo valor. os registros que tem a mesma Razão Social, mas que tb tem um nome fantasia não devem aparecer no resultado da busca.


Responder

Gostei + 0

20/07/2006

Cabelo

Se eu enendí bem... então o código abaixo deve resolver seu problema


select cod_cliente 
from 
  clientes 
where (NOME_RAZAO || NOME_FANTASIA) = (:Nome_Razao || :Nome_Fantasia)


Concatenando os dois campos, e os dois parâmetros


Responder

Gostei + 0

20/07/2006

Rodolpho123

[quote:a30615d094=´Rodolpho123´]Cara, Essa qry não dá para ser montada em Run-Time? Se vc utlizar a cláusula [b:a30615d094]or[/b:a30615d094], o plano de execução da qry [b:a30615d094]não[/b:a30615d094] vai utlizar nenhum índice.


Bom... primeiro que ´or´ não é uma cláusula... e sim um operador lógico...
-Valeu pela correção...me enganei

segundo... PQ não vai utilizar um índice...???????????
- Prq o interpretador não tem uma coluna definida para a busca, pois ele não vai pesquisar em um índice e depois ao outro, por isso, o [b:a30615d094]full-scan[/b:a30615d094] é inevitável

não entendí... isso depende de como vc criar sua tabela...
- Também concordo...acho que nesta estrutura, fica um pouco difícil fazer este tipo de pesquisa

se vc defineir o ídice como um doas campos, e depois outro índice com o outo campo irá funcionar perfeitamente.. 8)
-Mesmo definindo os índices em ambos os campos, utilizando o [b:a30615d094]or[/b:a30615d094], não vai pesquisar por nenhum índice. Lembrando que também não é aconselhavel criar vários índices, pois a perfórmance do BD cai....


[/quote:a30615d094]


Responder

Gostei + 0

20/07/2006

Cabelo

Rodolpho123

concordo com vc... eu iria sugerir fazer um select concatenado os campos, exatamente como na resposta anterior... pq aí sim o índice funcionaria, sendo que.. ele deve ser criado com os dois campos da pesquisa...

um abraço..


Responder

Gostei + 0

21/07/2006

Rodolpho123

Rodolpho123 concordo com vc... eu iria sugerir fazer um select concatenado os campos, exatamente como na resposta anterior... pq aí sim o índice funcionaria, sendo que.. ele deve ser criado com os dois campos da pesquisa... um abraço..


Aí assim, deste jeito, vai rolar ´redondinho´.....


Responder

Gostei + 0

02/08/2006

Raserafim

cabelo, com o seu código aconteceu o seguinte problema: na cláusula where caso um dos dois campos seja nulo então ele não concatena e despreza o registro. ou seja, só está sendo mostrado os registro que tem os dois campos preenchidos


Responder

Gostei + 0

02/08/2006

Raserafim

consegui resolver.

o problema da concatenação resolvi com o comando coalesce.

e tive também que alterar o seu código. foi preciso colocar um traço entre os campos.

o código ficou assim:
select nome_razao, nome_fantasia, (coalesce(nome_razao,´´) || ´ - ´ || coalesce(nome_fantasia,´´))
from clientes
where (coalesce(nome_razao,´´) || ´ - ´ || coalesce(nome_fantasia,´´)) like (:razao || ´ - ´ || :fantasia )



Responder

Gostei + 0

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

Aceitar