Existe alguma maneira de escrever consultas que não diferenciam maiúsculas de minúsculas no PostgreSQL, por exemplo, eu quero que as 3 consultas a seguir retornem o mesmo resultado.
SELECT id FROM groups where name='administrator'
SELECT id FROM groups where name='ADMINISTRATOR'
SELECT id FROM groups where name='Administrator'
postgresql
Jame
fonte
fonte
Respostas:
Use a função LOWER para converter as strings em minúsculas antes de comparar.
Tente o seguinte:
fonte
varchar_pattern_ops
se deseja que o índice funcione com aLIKE 'xxx%'
consulta, ou sejaCREATE INDEX ix_groups_name ON groups (lower(name) varchar_pattern_ops)
.ILIKE
: Funcionarábut with slow response
. Para obter acesso rápido às tabelas com base nos resultados dos cálculos, sugiro que qualquer pessoa que verifique isso deve ir com a resposta aceita. Veja mais detalhes aqui e aquiusando em
ILIKE
vez deLIKE
fonte
ILIKE
Hibernate não é suportado quando usado no Spring Boot.org.hibernate.dialect.PostgreSQL94Dialect
Spring Boot 2.0.6.RELEASE. Mas o IntelliJ reclama disso.A abordagem mais comum é minúscula ou maiúscula a sequência de pesquisa e os dados. Mas há dois problemas com isso.
Existem pelo menos três soluções usadas com menos frequência que podem ser mais eficazes.
CREATE INDEX ON groups (name::citext);
. (Mas veja abaixo.)CREATE INDEX ON groups (LOWER(name));
. Feito isso, você pode tirar proveito do índice com consultas comoSELECT id FROM groups WHERE LOWER(name) = LOWER('ADMINISTRATOR');
, ouSELECT id FROM groups WHERE LOWER(name) = 'administrator';
Você deve se lembrar de usar LOWER ().O módulo citext não fornece um tipo de dados que não diferencia maiúsculas de minúsculas. Em vez disso, ele se comporta como se cada sequência tivesse letras minúsculas. Ou seja, ele se comporta como se você tivesse chamado
lower()
cada string, como no número 3 acima. A vantagem é que os programadores não precisam se lembrar de minúsculas. Mas você precisa ler as seções "Comportamento de comparação de strings" e "Limitações" nos documentos antes de decidir usar o citext.fonte
col = 'a'
ecol = 'b'
). Sobre o item 2: Como você disse, você pode criar um índice em uma expressão, para que não seja realmente um problema. Mas concordo com você que a alteração do agrupamento provavelmente é a melhor solução.select * from pg_collation;
.Você pode usar
ILIKE
. iefonte
lower
função Veja mais detalhesVocê também pode ler a
ILIKE
palavra - chave. Às vezes, pode ser bastante útil, embora não esteja em conformidade com o padrão SQL. Veja aqui para mais informações: http://www.postgresql.org/docs/9.2/static/functions-matching.htmlfonte
email ILIKE 'user-input-email-here'
, não se esqueça da entrada do usuário. Caso contrário, as pessoas podem inserir caracteres como% que correspondam a qualquer coisa.ILIKE
eprepared statements
isso me protegerásql injection
?lower(column_name) like %expression%
.Você também pode usar expressões regulares POSIX, como
SELECT 'asd' ~* 'AsD'
retornat
fonte
O uso
~*
pode melhorar muito o desempenho, com a funcionalidade do INSTR.retornar linhas com o nome que contém OR é igual a 'adm'.
fonte