Consultar por determinada palavra

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
PericlesAlmeida
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Ter, 01 Nov 2011 2:57 pm
"A falta de tempo é desculpa daqueles que perdem tempo por falta de método"
Albert Einstein

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".
RafaelFantin
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 15 Dez 2011 4:01 pm

Tente assim:

Selecionar tudo

SELECT COUNT(DISTINCT SEQ)
FROM tabela
WHERE dsc like '%gado%'
PericlesAlmeida
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Ter, 01 Nov 2011 2:57 pm
"A falta de tempo é desculpa daqueles que perdem tempo por falta de método"
Albert Einstein

Dessa maneira RafaelFantin vai retornar toda a string que possuir "gado" por exemplo "apagado", "obrigado"e isso não me interessa.

Mesmo assim vlw
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Seu problema é o desempenho correto? e não que esta consulta esteja com erro?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

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.
PericlesAlmeida
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Ter, 01 Nov 2011 2:57 pm
"A falta de tempo é desculpa daqueles que perdem tempo por falta de método"
Albert Einstein

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.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

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
PericlesAlmeida
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Ter, 01 Nov 2011 2:57 pm
"A falta de tempo é desculpa daqueles que perdem tempo por falta de método"
Albert Einstein

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...
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

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.
PericlesAlmeida
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 15
Registrado em: Ter, 01 Nov 2011 2:57 pm
"A falta de tempo é desculpa daqueles que perdem tempo por falta de método"
Albert Einstein

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.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 6 visitantes