SQL insensível a casos SELECT
consulta FAQ: Como faço para emitir SQL SELECT
consultas ignorando maiúsculas ou minúsculas (ignorando se uma string é maiúscula ou minúscula)?
Fundo
Quando comecei a escrever consultas SQL estava a utilizar o Postgresql, e usei algumas das suas capacidades de expressão regulares personalizadas para realizar consultas não sensíveis a maiúsculas. Isso pareceu-me uma boa ideia na altura, mas quando tentei mover a minha aplicação para uma base de dados MySQL, uma parte da minha aplicação já não funcionava. Depois de alguma depuração lembrei-me que tinha utilizado as capacidades de consulta específicas do Postgreql, por isso tive de reescrever essa porção do código para trabalhar com o MySQL.
Para poupar algum desse luto, os exemplos seguintes mostram como escrever consultas SQL SELECT insensíveis a maiúsculas e minúsculas utilizando a sintaxe padrão SQL. As consultas mostradas devem funcionar com a maioria, se não todas, as bases de dados compatíveis com SQL 92.
Uma advertência muito importante
Por favor note que há uma coisa MUITO IMPORTANTE a dizer sobre a abordagem mostrada:
Estas consultas forçam a sua base de dados a realizar um scan de tabela. Isto significa que se tiver um índice na coluna que está a pesquisar, esse índice não será utilizado. Assim, se tiver um bilião de registos na sua tabela, esta abordagem forçará a base de dados a consultar todos os mil milhões de registos. Obviamente, esta é uma advertência muito importante de que precisa de estar ciente.
Não publico comentários de pessoas que usam linguagem depreciativa, mas como uma pessoa escreveu nos comentários (entre insultos), “usar uma função para converter uma coluna inteira de dados requer uma digitalização de tabela e deve ser evitada numa cláusula
WHERE
.”
Selecção SQL insensível à caixa: Usar funções superiores ou inferiores
A forma padrão de efectuar consultas SQL insensíveis a casos é usar as funções SQL upper
ou lower
, como esta:
select * from users where upper(first_name) = 'FRED';
ou esta:
select * from users where lower(first_name) = 'fred';
Como pode ver, o padrão é fazer o campo que está a pesquisar em maiúsculas ou minúsculas, e depois fazer a sua sequência de pesquisa também ser maiúscula ou minúscula para corresponder à função SQL que utilizou. Isto funciona com todas as bases de dados SQL que utilizei, incluindo Postgresql, MySQL, e SQL Server.
SQL LIKE queries
Pode utilizar a mesma técnica para tornar o seu SQL LIKE
queries case insensível também. Eis como utilizar a função maiúscula com um SQL LIKE
consulta:
select * from users where upper(first_name) like '%AL%';
e aqui está o mesmo SQL insensível a casos LIKE
consulta utilizando a função SQL lowercase
:
select * from users where lower(first_name) like '%al%';
Sumário
Espero que estes exemplos de consulta SQL SELECT insensível a casos sejam úteis. Mais uma vez, o truque é converter o que quer que esteja a procurar para maiúsculas ou minúsculas usando as funções SQL superior e inferior, e depois fazer com que a sua cadeia de pesquisa corresponda a esse caso.