Jump to content
Fórum Script Brasil
  • 0

Operador Like - Desconsiderar Tracos E Pontos


Halfar
 Share

Question

No campo Numero de uma tabela está gravado o seguinte registro:

413.517-8

O sistema de pesquisa utilizando o like deve desconsiderar os tracos e pontos na pesquisa, por exemplo, se o usuário digitar 4135178 (note que foram suprimidos o ponto e o traco), gostaria que o operador like me retornasse um resultado verdadeiro, ou seja, o registro foi localizado.

Note que a instrucao sql abaixo não contem pontos ou tracos, mas lá no banco de dados está com ponto e traco. Então tem algum modo do registro ser encontrado mesmo assim? Como escreveria a instrucao sql caso seja possível?

Select TipoNumero LIKE '%5134657%' order by Data Desc

Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0
No campo Numero de uma tabela está gravado o seguinte registro:

413.517-8

O sistema de pesquisa utilizando o like deve desconsiderar os tracos e pontos na pesquisa, por exemplo, se o usuário digitar 4135178 (note que foram suprimidos o ponto e o traco), gostaria que o operador like me retornasse um resultado verdadeiro, ou seja, o registro foi localizado.

Pelo que notei este seu campo "número" é do tipo char ou varchar. Então, verifique se você não pode usar a função REPLACE para obter o que deseja.

Exemplo

Select  REPLACE(REPLACE(TipoNumero,'.',''),'-','') LIKE '%5134657%' order by Data Desc

Função Replace segundo manual do mysql

REPLACE(str,da_str,para_str)

Retorna a string str com todas ocorrências da string da_str substituida pela string para_

str:

mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');

-> 'WwWwWw.mysql.com'

Esta função é multi-byte.

Edited by Denis Courcy
Link to comment
Share on other sites

  • 0

funcionou legal, mas tem um detalhe ainda para resolver. O fato é que não sabemos se o usuário no campo de pesquisa vai digitar com ponto ou sem ponto, com traço ou sem traço. A instrucao abaixo funciona para caso o usuário não digite pontos ou tracos.

O codigo abaixo está resumido, denro de $sql contem a parte inicial da instrucao, ou seja, Select * from tabela....etc... e dentro da variavel $condicao contem algum operador (and ou or).

$sql = $sql . $condicao . " REPLACE(REPLACE(TipoNumero,'.',''),'-','') LIKE '%".$xNumProcesso."%'";

Para exemplificar, no banco de dados está assim o campo TipoNumero: 513.465-7

Se a variável $xNumProcesso = 5134657 (este é o valor que o usuário digitou na pesquisa), aí a instrucao acima localiza o registro corretamente. Agora se digitar com pontos ou tracos aí não encontra. Para solucionar isto, tentei fazer assim:

$sql = $sql . $condicao . " REPLACE(REPLACE(TipoNumero,'.',''),'-','') LIKE '%".$xNumProcesso."%' or LIKE '%".$xNumProcesso."%'";

neste caso dá erro de sintaxe...

Link to comment
Share on other sites

  • 0
funcionou legal, mas tem um detalhe ainda para resolver. O fato é que não sabemos se o usuário no campo de pesquisa vai digitar com ponto ou sem ponto, com traço ou sem traço. A instrucao abaixo funciona para caso o usuário não digite pontos ou tracos.

O codigo abaixo está resumido, denro de $sql contem a parte inicial da instrucao, ou seja, Select * from tabela....etc... e dentro da variavel $condicao contem algum operador (and ou or).

$sql = $sql . $condicao . " REPLACE(REPLACE(TipoNumero,'.',''),'-','') LIKE '%".$xNumProcesso."%'";
Para exemplificar, no banco de dados está assim o campo TipoNumero: 513.465-7 Se a variável $xNumProcesso = 5134657 (este é o valor que o usuário digitou na pesquisa), aí a instrucao acima localiza o registro corretamente. Agora se digitar com pontos ou tracos aí não encontra. Para solucionar isto, tentei fazer assim: $sql = $sql . $condicao . " REPLACE(REPLACE(TipoNumero,'.',''),'-','') LIKE '%".$xNumProcesso."%' or LIKE '%".$xNumProcesso."%'"; neste caso dá erro de sintaxe...
Então o que você tem que fazer é garantir que os dois lados da pesquisa estejam do mesmo jeito. Para isto será necessário incluir mais uma função chamada de concat. O uso desta função a direira da cláusula LIKE implica em não utilizar os apóstrofos como delimitadores para a referida cláusula. Ficará assim:
Select  REPLACE(REPLACE(TipoNumero,'.',''),'-','') LIKE CONCAT('%', REPLACE(REPLACE(@VARIAVEL,'.',''),'-',''),'%') order by Data Desc

onde: @VARIAVEL é a sua variável.

att

Denis Courcy

Edited by Denis Courcy
Link to comment
Share on other sites

  • 0

Olha, não está funcionando, está dando erro de sintaxe.

veja o codigo abaixo, lembrando que dentro da variavel $sql já contem o select * from tabela ...etc...

$sql = $sql . $condicao . " REPLACE(REPLACE(TipoNumero,'.',''),'-','') LIKE CONCAT('%', REPLACE(REPLACE(@$xNumProcesso,'.',''),'-',''),'%') order by Data Desc";
Link to comment
Share on other sites

  • 0
Olha, não está funcionando, está dando erro de sintaxe.

veja o codigo abaixo, lembrando que dentro da variavel $sql já contem o select * from tabela ...etc...

$sql = $sql . $condicao . " REPLACE(REPLACE(TipoNumero,'.',''),'-','') LIKE CONCAT('%', REPLACE(REPLACE(@$xNumProcesso,'.',''),'-',''),'%') order by Data Desc";
Retire o sinal de "@". "@VARIAVEL" ele era somente uma demonstração. Fica assim:
$sql = $sql . $condicao . " REPLACE(REPLACE(TipoNumero,'.',''),'-','') LIKE CONCAT('%', REPLACE(REPLACE($xNumProcesso,'.',''),'-',''),'%') order by Data Desc";

PS. Não conheço PHP ainda (se é que é esta a linguagem que você está usando).

att

Denis Courcy

Link to comment
Share on other sites

  • 0

infelizmente ainda não funcionou... persiste o erro de sintaxe..., conforme abaixo:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by Data Desc' at line 2

será que a versao do mysql que uso aceita concat?

fiz uma alteracao no codigo e creio que agora resolveu,

$xNumProcesso = str_replace('-','',$xNumProcesso);

$xNumProcesso = str_replace('.','',$xNumProcesso);

$xNumProcesso = str_replace('/','',$xNumProcesso);

$sql = $sql . $condicao . " REPLACE(REPLACE(TipoNumero,'.',''),'-','') LIKE '%".$xNumProcesso."%'";

Link to comment
Share on other sites

  • 0
infelizmente ainda não funcionou... persiste o erro de sintaxe..., conforme abaixo:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'order by Data Desc' at line 2

será que a versao do mysql que uso aceita concat?

$sql = $sql . $condicao . " REPLACE(REPLACE(TipoNumero,'.',''),'-','') LIKE CONCAT('%', REPLACE(REPLACE("  +   $xNumProcesso  +  ",'.',''),'-',''),'%') order by Data Desc";

Estava faltando o operador de concatenação para a formação da string que é a sua SQL

Se não for o sinal de + substitua por outro usado na linguagem de programação que você está usando.

att Denis Courcy

Edited by Denis Courcy
Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
 Share



  • Forum Statistics

    • Total Topics
      150.1k
    • Total Posts
      647k
×
×
  • Create New...