Página 1 de 1

Pesquisa em SQL interessante

Enviado: 11 Dez 2015 00:42
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.

Pesquisa em SQL interessante

Enviado: 11 Dez 2015 14:41
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'