Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rodox

Pesquisa com Like "palavra exata"

Recommended Posts

Boa noite amigos estou enfrentando um probleminha com o comando LIKE do SQL SERVER 2000 !!! tenho a seguinte tabela com os seguintes registros:

 

ID|texto

1 - parede;bloco;móveis

2 - banheiro;imóveis;cama

3 - quarto;cozinha;lavanderia

 

Quando faço uma pesquisa com o LIKE : SELECT * FROM teste WHERE texto LIKE '%móveis%' ele me tras o registro 1 e 2 pois o SQL Server não consegue distinguir a diferença entre a palavra móveis de imóveis, o que eu queria era achar apenas a palavra exata ! ou seja apenas os registros que contém realmente a palavra móveis !!

 

isso é possível ???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite amigos estou enfrentando um probleminha com o comando LIKE do SQL SERVER 2000 !!! tenho a seguinte tabela com os seguintes registros:

 

ID|texto

1 - parede;bloco;móveis

2 - banheiro;imóveis;cama

3 - quarto;cozinha;lavanderia

 

Quando faço uma pesquisa com o LIKE : SELECT * FROM teste WHERE texto LIKE '%móveis%' ele me tras o registro 1 e 2 pois o SQL Server não consegue distinguir a diferença entre a palavra móveis de imóveis, o que eu queria era achar apenas a palavra exata ! ou seja apenas os registros que contém realmente a palavra móveis !!

 

isso é possível ???

tenta colocando um espaço antes do móveis....

SELECT * FROM teste WHERE texto LIKE '% móveis%'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola.

 

Se a estrutura for a que você montou, use

SELECT * FROM teste WHERE texto LIKE '%;móveis%'

Abçs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Rodox!

 

Hm, você tem de entender o conceito dos % do parâmetro like.

 

Quando uma palavra é colocada entre as %, como no seu caso, significa que você quer o registro que possua essa palavra, independente de possuir algo antes ou depois dela. Nesse caso, você vai encontrar imóveis, automóveis, móveis italianos e etc.

 

Eu faria como o jus2ka disse, caso você tenha certeza de que seu registro esteja daquele jeito mesmo e não corra o risco de aparecer um 'vendedor de móveis' que você também queira selecionar. Do contrário, utilize:

 

SELECT * FROM teste WHERE texto LIKE 'móveis%'

Assim, você eliminou tudo o que tenha antes da palavra móveis. Mas lembre-se de que se aparecer algum registro como móveis italianos, ele vai ser selecionado.

 

Outra dica seria normalizar essa sua tabela, adicionando códigos no lugar das palavras e relacionando uma tabela com esses códigos. Mas isso também depende do seu tempo para desenvolvimento, pois possivelmente incluirá uma mudança tanto no BD quanto no seu código. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

 

Até mais!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

Estou passando por uma dificuldade inesperada e preciso de ajuda.

Meu código está assim:

 

ElseIf SType = "AnyWord" Then

If i <> WordCounter Then

SQL1 = SQL1 & strFieldName & " LIKE '%" & Word(i) & "%' OR "

ElseIf i = WordCounter Then

SQL1 = SQL1 & strFieldName & " LIKE '%" & Word(i) & "%'"

End If

 

Gostaria que ele encontrasse a palavra exata. fiz assim:

Tirei os "%" do início das variáveis e beleza: diferencia móveis de imóveis.

 

SQL1 = SQL1 & strFieldName & " LIKE '" & Word(i) & "%' OR "

ElseIf i = WordCounter Then

SQL1 = SQL1 & strFieldName & " LIKE '" & Word(i) & "%'"

 

Mas tem um problema: se eu pesquisar a palavra aço ele encontra açougue.

O problema é que se eu tirar os "%" do final, ele não encontra nada.

 

 

Já tirei somente os "%", já tirei este sinal junto com as aspas (mas aí dá um erro"

 

Alguem poderia me indicar a ortografia correta para este código.

 

Agradeço.

 

 

O cfódigo completo pode ser encontrado aqui:

http://www.4guysfromrolla.com/webtech/052799-1.shtml

Compartilhar este post


Link para o post
Compartilhar em outros sites

do jeito que esta ali voce precisa levar em consideração a posição do ponto e virgula

 

So reforço que isso nao aconteceria se seu banco estive normalizado

 

mas vamos lá

 

mais ou menos assim

 

SELECT * FROM teste WHERE texto LIKE '%;móveis;%' OR texto LIKE 'móveis;%' OR texto LIKE '%;móveis'

Veja

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Mário,

 

Como devo fazer então no caso da variável:

 

SQL1 = SQL1 & strFieldName & " LIKE '%;" & Word(i) & ";%' OR "

 

ou assim:

 

SQL1 = SQL1 & strFieldName & " LIKE '%" ;& Word(i) &; "%' OR "

 

Qual a função deste ponto-e-vírgula?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o ponte e virgula é texto deve ficar entre aspas e voce concatena com a variavel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tentei colocar os ponto-e-vírgula de várias formas mas o script não encontra.

O que acontece é que se eu coloco o ponto-e-virgula a pesquisa procura ";aço;"

 

Tentei fazer assim:

 

 

If i <> WordCounter Then

SQL1 = SQL1 & strFieldName & " LIKE '%" & Word(i) & "%' REGEXP '(^|[ ,])" & Word(i) & "([ ,]|$)' AND "

ElseIf i = WordCounter Then

SQL1 = SQL1 & strFieldName & " LIKE '%" & Word(i) & "%' REGEXP '(^|[ ,])" & Word(i) & "([ ,]|$)' "

 

 

 

Mas retornou este erro:

 

 

Microsoft OLE DB Provider for ODBC Drivers erro '80040e14'

 

[Microsoft][Driver ODBC para Microsoft Access] Erro de sintaxe (operador faltando) na expressão de consulta 'aciklama4 LIKE '%AÇO%' REGEXP '(^|[ ,])AÇO([ ,]|$)''.

 

/guia_pir/SearchField.asp, line 388

Compartilhar este post


Link para o post
Compartilhar em outros sites

assim

 

SQL1 = SQL1 & strFieldName & " LIKE '%;" & Word(i) & ";%' OR "

dentro das aspas

 

faça para os casos que te passei la em cima e veja se vai

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Mário, Muito obrigado por sua atenção! Obrigado por sua dica!,

 

Veja o que fiz seguindo suas orientações (me corrija se eu estiver errado)

Na coluna onde é feita a pesquisa, as palavras-chave estão separadas assim:

 

*1*[codeboxX] imóveis, imobiliárias, casas, apartamentos, pirassununga,[/codeboxX]

*2*[codeboxX] móveis, camas, armários, pirassununga,[/codeboxX]

*3*[codeboxX] móveis, camas, armários, aguaí,[/codeboxX]

*4*[codeboxX] pães, doces, bolos, pirassununga,[/codeboxX]

 

Sempre com um espaço na frente e uma vírgula depois de cada palavra, então fiz assim a pesquisa:

 

CODE
For i = 1 to WordCounter

If SType = "AllWords" Then

If i <> WordCounter Then

SQL1 = SQL1 & strFieldName & " LIKE '% " & Word(i) & ",%' AND "

ElseIf i = WordCounter Then

SQL1 = SQL1 & strFieldName & " LIKE '% " & Word(i) & ",%'"

End If

ElseIf SType = "AnyWord" Then

If i <> WordCounter Then

SQL1 = SQL1 & strFieldName & " LIKE '% " & Word(i) & ",%' OR "

ElseIf i = WordCounter Then

SQL1 = SQL1 & strFieldName & " LIKE '% " & Word(i) & ",%'"

End If

End If

Um espaço em branco depois do 1º %, e uma vírgula depois do segundo %.

Funcionou.

 

Mas agora estou com outro problema:

(1 usando a função OR)

Se digito na pesquisa "móveis" ele me retorna o *2* e o *3*.

Se digito "móveis pirassununga" ele me retorna o *1*,*2*,*3*, e *4*

O que eu gostaria era somente os móveis em pirassununga, então ele deveria me retornar somente *2*

 

(2 usando a função AND)

Se digito na pesquisa "móveis" ele me retorna o *2* e o *3*.

Se digito "móveis pirassununga" ele me retorna nada

Tentei colocar (forçar) a pesquisa usando:

" móveis, pirassununga,"

"móveis; pirassununga"

"móveis, pirassununga"

Mas ele ainda me retorna nenhum valor

 

Você ou alguém pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

humm.. entendi

 

você quer buscar registros que contenham as palavras móveis e pirassununga ?

 

mas o que está acontecendo é que retorna tudo que tem moveis ou tudo que tem pirassununga não é ?

 

tente utilizar subquery ou isso:

 

Em MySQL funciona da forma como você está fazendo:

SELECT * FROM table

WHERE

field like '%moveis%'

AND

field like '%pirassununga%'

;

 

 

em SQL Server e Oracle, utilize a função "LOWER"

exemplo:

SELECT * FROM table

WHERE

LOWER(field) like '%moveis%'

AND

LOWER(field) like '%pirassununga%'

;

obs: se usar lower, a palavra a ser persquisada deve estar em caixa baixa também.

Compartilhar este post


Link para o post
Compartilhar em outros sites

escreve na tela o resultado da consulta que esta tentando fazer de fato

 

escreve na tela o valor de SQL1

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

 

Olá Hinom, qto à caixa baixa posso colocar um javaScript no formulario de pesquisa para q ele envie a requisição ao servidor {bando dados em access, com manipulação DSN} em caixa baixa ou caixa alta (a coluna da pesquisa no BD está em caixa alta)(posso mudar os dados desta coluna de pesquisa <palavras-chaves> para caixa baixa se for o caso), mais ou menos assim:

 

 

SQL = "SELECT * FROM " & strTableName & " WHERE LOWER(field) like" & Word(i) & " AND LOWER(field) like " & Word(i) & " ";

 

Fiz como acima e ficou do mesmo jeito, o problema é que o formulário que gera a variável " & Word(i) & " tem somente uma entrada:

 

<INPUT TYPE=TEXT id="SValue" NAME="SValue" SIZE=55 style="background-color: #FFFFFF">

(SValue gera o " & Word(i) & ")

 

 

Sou novato em asp e estou ..quase... fazendo um bd para cada cidade.... UI

Compartilhar este post


Link para o post
Compartilhar em outros sites

escreve na tela o resultado da consulta que esta tentando fazer de fato

 

escreve na tela o valor de SQL1

 

 

Mas SQL1 não é a resposta do servidor para a minha busca?

Não entendi muito bem....

 

 

 

 

Mário, é poss;ível por exemplo:

Faço a pesquisa por "móveis", ele me retorna o *1* e *2*

(todos os móveis não importando a cidade) e nesta tela (página) de resposta filtrar somente os resultados da cidade de pirassununga? Usando um JavaScript cliente por exemplo?

Compartilhar este post


Link para o post
Compartilhar em outros sites

faça como o Mário sugeriu

 

mande escrever na tela a query sql que foi construída antes de executá-la.

 

copie o que aparecer e poste aqui

 

 

quanto ao que postei sobre letra maiúscula ou minúscula não necessita converter a string basta ulizar o comando dentro da query sql. Isso é para evitar que se perca a forma original com a qual o usuario digitou. Mas por enquanto, faça o que o Mário pediu.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.