O comportamento padrão de LIKE
e de outros operadores de comparação, =
etc faz distinção entre maiúsculas e minúsculas.
É possível torná-los sem distinção entre maiúsculas e minúsculas?
sql
oracle
case-sensitive
case-insensitive
sql-like
sergionni
fonte
fonte
REGEXP_LIKE(username,'me','i')
LIKE?Respostas:
Desde 10gR2, o Oracle permite ajustar o comportamento das comparações de cadeias, definindo os parâmetros
NLS_COMP
eNLS_SORT
session:Você também pode criar índices que não diferenciam maiúsculas de minúsculas:
Essas informações foram obtidas de pesquisas que não diferenciam maiúsculas de minúsculas do Oracle . O artigo menciona,
REGEXP_LIKE
mas parece funcionar bem=
também.Nas versões anteriores a 10gR2, isso realmente não pode ser feito, e a abordagem usual, se você não precisar de pesquisa sem distinção de sotaque , é apenas
UPPER()
a coluna e a expressão de pesquisa.fonte
LIKE
Expressões arbitrárias (por exemploWHERE foo LIKE '%abc%'
) já são lentas o suficiente se não puderem ser indexadas, não acho que esteja especificamente relacionado à sensibilidade a casos.DBD::Oracle
, você pode escrever$ENV{NLS_SORT} = 'BINARY_CI'; $ENV{NLS_COMP} = 'LINGUISTIC';
antes de chamar `DBI-> connect`.ALTER SESSION
único altera sua instância local da correção e isso significa como sua sessão atual, ou seja, se eu fechar e reabrir, ela será redefinida. Existe uma maneira que eu possa ver o que os valores atuais são de modo que se a sua persistiu em todos os lugares que eu posso mudar de volta para as configurações originais ...Existem três maneiras principais de executar uma pesquisa que não diferencia maiúsculas de minúsculas no Oracle sem usar índices de texto completo.
Em última análise, o método escolhido depende das circunstâncias individuais; o principal a lembrar é que, para melhorar o desempenho, você deve indexar corretamente a pesquisa que não diferencia maiúsculas de minúsculas.
1. Coloque sua coluna e sua string de forma idêntica.
Você pode forçar todos os seus dados a serem o mesmo caso usando
UPPER()
ouLOWER()
:ou
Se
column_1
não estiver indexadoupper(column_1)
oulower(column_1)
, conforme apropriado, isso poderá forçar uma verificação completa da tabela. Para evitar isso, você pode criar um índice baseado em funções .Se você estiver usando o LIKE, precisará concatenar uma
%
sequência de caracteres que está procurando.Este SQL Fiddle demonstra o que acontece em todas essas consultas. Observe os planos de explicação, que indicam quando um índice está sendo usado e quando não está.
2. Use expressões regulares.
A partir do Oracle 10g,
REGEXP_LIKE()
está disponível. Você pode especificar o _match_parameter_'i'
, para executar uma pesquisa que não diferencia maiúsculas de minúsculas.Para usar isso como um operador de igualdade, você deve especificar o início e o fim da sequência, que é indicada pelo quilate e pelo sinal de dólar.
Para executar o equivalente a LIKE, eles podem ser removidos.
Tenha cuidado com isso, pois sua sequência pode conter caracteres que serão interpretados de maneira diferente pelo mecanismo de expressão regular.
Este SQL Fiddle mostra o mesmo exemplo de saída, exceto usando REGEXP_LIKE ().
3. Altere-o no nível da sessão.
O parâmetro NLS_SORT controla a sequência de intercalação para pedidos e os vários operadores de comparação, incluindo
=
e LIKE. Você pode especificar uma classificação binária, sem distinção entre maiúsculas e minúsculas, alterando a sessão. Isso significa que todas as consultas executadas nessa sessão executam parâmetros que não diferenciam maiúsculas de minúsculas.Há muitas informações adicionais sobre classificação linguística e pesquisa de strings, se você deseja especificar um idioma diferente ou fazer uma pesquisa sem distinção de sotaque usando BINARY_AI.
Você também precisará alterar o parâmetro NLS_COMP ; citar:
O valor padrão de NLS_COMP é BINARY; mas, LINGUISTIC especifica que o Oracle deve prestar atenção ao valor de NLS_SORT:
Então, mais uma vez, você precisa alterar a sessão
Conforme observado na documentação, você pode criar um índice linguístico para melhorar o desempenho
fonte
select * from my_table where lower(column_1) LIKE lower('my_string') || '%';
vez deselect * from my_table where lower(column_1) LIKE lower('my_string%');
? Isso dá alguma vantagem?regexp_like
, existe uma maneira de escapar dessas seqüências? Dando um exemplo, se a string tiver $, a saída não será a esperada. // cc @Ben e outros, por favor, compartilhem.`
é o caractere de escape @bozzmob. Não deve haver diferença na saída se a string na qual a expressão regular está operando contiver a$
, isso só poderá causar problemas se você precisar de um$
literal em sua expressão regular. Se você tiver um problema específico, eu faria outra pergunta se este comentário / resposta não ajudar.talvez você possa tentar usar
fonte
WHERE upper(user_name) LIKE UPPER('%ME%')
isso? :)UPPER
o parâmetro de entrada também?upper
função de perder o índice, você tem alguma idéia de como fazer pesquisas usando o índice?No Oracle 12c R2, você poderia usar
COLLATE operator
:Demo:
db <> demo de violino
fonte
fonte
%
's no primeiro argumento para a sua segundaNLSSORT
são não pretende ser wildcards, certo? Eles meio que confundem.você pode fazer algo assim:
fonte