Ignorando case sensitive na consulta SQL
Vou mostrar aqui uma solução que tenho utilizado frequentemente em alguns trabalhos, substituindo um pouco uma série de tratamentos dentro da query e consequentemente, economizando um tempinho!
Problema:
Como fazer buscas em banco de dados ignorando letras maiusculas/minusculas?
Geralmente os SGBDs são case sensitive e é muito comum recorrermos a alternativas para transformar os textos na hora de comparar valores do banco case sensitive em consultas que fazemos.
Exemplo de uma query comum:
SELECT * FROM cliente WHERE nome LIKE ‘%Marcelo%’;
Nessa query, retornarão apenas clientes que possuam Marcelo (com M maiúsculo) no nome. Se o valor consultado estivesse em letras minúsculas (marcelo), ignoraria todos os nomes em maiúsculos cadastrados no banco.
Alternativa Padrão:
Algumas pessoas passaram a utilizar a função UPPER para eliminar esse problema:
SELECT * FROM cliente WHERE UPPER(nome) LIKE ‘%’ || UPPER(‘Marcelo’) || ‘%’;
Nesse caso, o valor armazenado na coluna nome será transformado para CAIXA ALTA e o mesmo acontecerá para o valor consultado. No caso, o valor Marcelo será transformado para MARCELO.
Isso funciona até certo ponto, pois essa função não converte letras acentuadas e caracteres especiais. No caso, João seria transformado para JOãO. Creio que esse não é o nosso objetivo, nesse caso.
Eis a solução para o problema:
Sendo assim, a melhor alternativa para esse caso seria usar o termo “~*” (til + asterístico). Nesse caso, o Postgre automaticamente procura por qualquer ocorrência do valor pesquisado, ignorando o case sensitive.
SELECT * FROM cliente WHERE nome ~* ‘Marcelo’;
Essa técnica funciona em PostgreSQL e MySQL mas nunca testei no Oracle ou MSSQL. Quem experimentar pode compartilhar conosco o resultado com comentários.