Pular para o conteúdo

Marcado: 

  • Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 4 anos, 1 mês atrás por Avatar de José Laurindo ChiappaJosé Laurindo Chiappa.
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #145477
    Avatar de Gustavo Henrique KunertGustavo Henrique Kunert
    Participante

      Olá, preciso fazer um select onde o parametro da pesquisa é uma coluna de nome completo, e o que alimenta este parametro é um outro select que vem de outro banco de dados, conforme o exemplo: select nome_completo,login,cpf where usuarios in (select nome from cadastro@db_link);. O problema é a diferença dos nomes em cada tabela, pois ha nomes abreviados, e é aí que o like entra, com colocar um select na clausula like? Outra solução também é bem vinda.

       

      #145500
      Avatar de José Laurindo ChiappaJosé Laurindo Chiappa
      Moderador

        Blz ? Então, a ** primeiríssima coisa ** que eu TENHO que observar é que o LIKE é um operador meio ‘burro’, ele só serve pra vc encontrar uma substring segundo um padrão SIMPLES dentro de outra string maior : digamos, pra encontrar JOSÉ dentro da string JOSÈ LAURINDO CHIAPPA.. Já para casos como LUIS e LUIZ por exemplo, onde há DIFERENÇA de caracteres aí com ** absoluta ** certeza ele não te adianta de coisa alguma, é inútil… E é CLARO, há também a questão da PERFORMANCE, não é incomum para grandes volumes de dados mesmo que haja um índice normal o LIKE forçar vc a olhar TODAS as entradas do índice, por exemplo….
        A SOLUÇÃO para ambos os casos (ie, Performance E buscas com operadores mais ‘inteligentes’) é, SE O TEU DATABASE ORACLE aceita/suporta, vc criar um índice especial de busca, o CONTEXT INDEX : com essa cara criado, vc pode usar na sua query o operador CONTAINS, que não só faz o mesmo serviço do LIKE (porém de maneira muito mais rápida e eficiente, via de regra : dá um look em https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:1094633279498 para algumas refs de possíveis issues de performance com LIKE) mas Também permite encontrar palavras próximas entre si com o operador NEAR (tipo o exemplo citado, LUIS e LUIZ, só com uma letra de diferença), permite encontrar palavras com sons próximos (usando o SOUNDEX, que é baseado no Inglês, mas muitas vezes ajuda mesmo assim)…. Seria a solução ideal : veja a documentação Oracle pra mais detalhes e exemplos, https://docs.oracle.com/en/database/oracle/oracle-database/19/ccapp/querying-with-oracle-text.html#GUID-7310390A-4E76-45D3-99E8-070692043E6B é a documentação online da versão 19c mas CONTEXT INDEXES já existem desde pelo menos a versão 10g iirc….

        ==> CASO porém vc não possa usar CONTEXT INDEXES por qquer motivo (seja porque teu database não tem essa Option instalada/presente, seja porque teu DBA não deixa vc a usar, seja por qual motivo for), se vc realmente for apelar pro LIKE afaik vc VAI ter que usar SQL DINÂMICO, o que implica em escrever teu SQL num bloco PL/SQL via de regra, e assim : num SQL fixo o LIKE está programado para receber uma STRING, não uma bind variable ou uma coluna de SELECT ou qquer repositório de dados do tipo : alguns exemplos de LIKE num SQL dinâmico são https://stackoverflow.com/questions/44113275/oracle-using-bind-variable-in-like-clause-of-dynamic-cursor e https://asktom.oracle.com/pls/asktom/f%3Fp%3D100:11:0%253A%253A%253A%253AP11_QUESTION_ID:1669972300346534908 por exemplo : tente adaptar essa lógica no cursor SQL que busca a informação da outra tabela e monta/executa um LIKE com esse dado na tabela principal….

        Abraços,

        Chiappa

      Visualizando 2 posts - 1 até 2 (de 2 do total)
      • Você deve fazer login para responder a este tópico.
      plugins premium WordPress