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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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: 3092
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