Pesquisa em SQL interessante

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Pesquisa em SQL interessante

Mensagem por JoséQuintas »

Pra facilitar criei isto

Código: Selecionar todos

@ 2, 0 GET cEndereco PICTURE "@!"
READ

cSql := "SELECT * FROM CADASTRO WHERE " + MySqlEnderecoLike( cEndereco )
Temporario := cnMySql:Execute( cSql )
...

FUNCTION MySqlEnderecoLike( cEndereco )

   LOCAL cPalavra, cSql := " 1=1"

   cEndereco := Trim( cEndereco )
   DO WHILE Len( cEndereco ) != 0
      cPalavra  := Substr( cEndereco, 1, At( " ", cEndereco + " " ) - 1 )
      cEndereco := AllTrim( Substr( cEndereco, At( " ", cEndereco + " " ) + 1 ) )
      cSql      += " AND ENDERECO LIKE '%" + cPalavra + "%'"
   ENDDO
   RETURN cSql
Supondo que o usuário digite: EL ATA IBA GAL AV

Vai encontrar, por exemplo, AV GAL ATALIBA LEONEL

Essa função cria o que é necessário para o comando SQL, a fim de que retorne ENDERECO que possua qualquer dessas palavras em qualquer posição

É algo relativamente simples, mas muito útil

Nota: o conteúdo inicial 1=1 resolve duas situações: endereço vazio, e juntar os AND.
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3109
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Pesquisa em SQL interessante

Mensagem por alxsts »

Olá!

Em qualquer banco de dados relacional, é preciso planejar bem o uso da cláusula LIKE e funções, como Lower(), Upper(), etc, para evitar degradação da performance. Por exemplo: se você tem uma tabela tbNames com a coluna dsName e existir um índice para esta coluna, ao executar

Código: Selecionar todos

SELECT * FROM tbNames WHERE dsName = 'Fórum PC Toledo'
o motor SQL utilizará o índice da coluna. Já os comandos abaixo não usarão. Será executada a leitura sequencial da tabela (full table scan):

Código: Selecionar todos

SELECT * FROM tbNames WHERE dsName LIKE 'Fórum%'

Código: Selecionar todos

SELECT * FROM tbNames WHERE Upper(dsName) = 'FÓRUM PC TOLEDO'
[]´s
Alexandre Santos (AlxSts)
Responder