Página 1 de 1

Consultar por determinada palavra

Enviado: Seg, 13 Fev 2012 12:50 pm
por PericlesAlmeida
Senhores, estou tendo um pequeno problema de desempenho na consulta baixo:

Selecionar tudo

SELECT COUNT(DISTINCT SEQ)
  FROM tabela 
 WHERE (
 ( REGEXP_LIKE(DSC, 'gado','i')) AND
   NOT REGEXP_LIKE(DSC, '[a-z0-9;]gado','i') AND
   NOT REGEXP_LIKE(DSC, 'gado[a-z0-9;]','i')) 
Alguém tem uma sugestão para como realizar essa consulta, que tem como objetivo consultar uma determinada "palavra" que pode estar no começo, no fim ou no meio de uma "frase".

Re: Consultar por determinada palavra

Enviado: Seg, 13 Fev 2012 12:59 pm
por RafaelFantin
Tente assim:

Selecionar tudo

SELECT COUNT(DISTINCT SEQ)
FROM tabela
WHERE dsc like '%gado%'

Re: Consultar por determinada palavra

Enviado: Seg, 13 Fev 2012 1:01 pm
por PericlesAlmeida
Dessa maneira RafaelFantin vai retornar toda a string que possuir "gado" por exemplo "apagado", "obrigado"e isso não me interessa.

Mesmo assim vlw

Re: Consultar por determinada palavra

Enviado: Seg, 13 Fev 2012 1:34 pm
por DanielNN
Seu problema é o desempenho correto? e não que esta consulta esteja com erro?

Re: Consultar por determinada palavra

Enviado: Seg, 13 Fev 2012 1:40 pm
por Trevisolli
Brother,

Se essa palavra (gado), levar espaços em branco do lado direito e, esquerdo, poderia tentar assim:

Selecionar tudo

with sl as (    
      select 'abcde gado 1 fghij' as nome
            from dual
          union
          select 'defgh 2 apgagado ijklm' as nome
            from dual
          union
          select 'nopqrs obrigado 3 tuvxyz' as nome from dual  )
select count(distinct nome)
  from sl    
 where sl.nome like '% gado %'

Veja se lhe ajuda, senão, posta pra gente.

Re: Consultar por determinada palavra

Enviado: Seg, 13 Fev 2012 2:02 pm
por PericlesAlmeida
A palavra leva espaços ao lado se estiver no meio da frase por exemplo:

"José gosta de gado amarelo."

ou não tem espaço no começo:

"Gado bom é nelore."

ou não espaço no fim

"João gosta de gado."

E sim é problema de DESEMPENHO.

Re: Consultar por determinada palavra

Enviado: Seg, 13 Fev 2012 3:40 pm
por DanielNN
Cara,
tenta como o seguinte:

Selecionar tudo

SELECT COUNT(*)
FROM (   select 'abcde gado 1 fghij' as nome      from dual
          union
          select 'defgh 2 apgagado ijklm' as nome    from dual
          union
          select 'nopqrs obrigado 3 tuvxyz' as nome from dual
          union
          select 'gado 4 tuvxyz' as nome from dual
          union
          select 'gadogado 5 tuvxyz' as nome from dual
          union
          select 'nopqrs 5 gadogado' as nome from dual
          union
          select 'nopqrs 5 obri gado' as nome from dual  )
WHERE ' ' || lower(NOME) || ' ' like '% gado %'
OBS: um truquezim para sair de REG_EXP. :P

Re: Consultar por determinada palavra

Enviado: Seg, 13 Fev 2012 4:19 pm
por PericlesAlmeida
Massa Noctifero, para campo texto essa consulta é perfeita.

Mas tenho um probleminha :(, a consulta acima é realizada em campos CLOB que normalmente é um HTML, portanto não é só colocar um espaço...

Estou começando a pensar em desconsiderar o começo e fim de frases...

Re: Consultar por determinada palavra

Enviado: Seg, 13 Fev 2012 4:41 pm
por DanielNN
Acredito que isso possa ajudar :
http://asktom.oracle.com/pls/asktom/f?p ... 7980988799

O problema é que pode deixar mais lento fazendo essa conversão, mas vale tentar.

Re: Consultar por determinada palavra

Enviado: Seg, 13 Fev 2012 4:50 pm
por PericlesAlmeida
beleza, Noctifero vou dar uma olhada.

Por enquanto estou utilizando:

Selecionar tudo

 NVL(DBMS_LOB.INSTR(upper(dsc),' GADO '),0) != 0 
Se a palavra não estiver no começo nem no fim da frase eu encontro, a diferença de desempenho é estúpida a consulta anterior demorava 80 segundos essa demora de 7 a 10 segundos.

Obrigado a todos que contribuiram.