SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Como tornar o operador LIKE do SQLite sensível a maiúsculas e minúsculas


Por padrão, o SQLite LIKE operador não diferencia maiúsculas de minúsculas para caracteres ASCII. Isso significa que ele corresponderá a caracteres maiúsculos e minúsculos, independentemente de qual maiúscula você usar em seu padrão.

No entanto, existe uma técnica que você pode usar para fazer distinção entre maiúsculas e minúsculas.

SQLite tem uma instrução PRAGMA chamada case_sensitive_like , que é projetado especificamente para tornar o LIKE operador diferencia maiúsculas de minúsculas para caracteres ASCII.

A razão pela qual eu especifico “caracteres ASCII” é porque, o LIKE O operador diferencia maiúsculas de minúsculas por padrão para caracteres unicode que estão além do intervalo ASCII.

Portanto, se você precisar do LIKE operador para diferenciar maiúsculas de minúsculas no intervalo ASCII, o case_sensitive_like A declaração PRAGMA pode ser o que você está procurando.

Isso também se aplica ao like() função, que funciona exatamente da mesma forma que a função LIKE operador.

Ativar/desativar a diferenciação entre maiúsculas e minúsculas


Você pode usar qualquer um dos seguintes valores booleanos para habilitar a diferenciação entre maiúsculas e minúsculas:
1
on
true
yes

Você pode usar qualquer um dos seguintes valores booleanos para desabilitar a diferenciação entre maiúsculas e minúsculas:
0
off
false
no

O argumento pode estar entre parênteses ou pode ser separado do nome do pragma por um sinal de igual.

Argumentos de palavra-chave podem, opcionalmente, aparecer entre aspas.

Exemplo sem distinção entre maiúsculas e minúsculas


Primeiro, vamos ver o que acontece quando não usamos o case_sensitive_like Declaração PRAGMA.
SELECT 
  'a' LIKE 'A',
  'æ' LIKE 'Æ';

Resultado:
'a' LIKE 'A'  'æ' LIKE 'Æ'
------------  ------------
1             0           

Nesse caso, a primeira coluna não diferencia maiúsculas de minúsculas – a maiúscula A corresponde à minúscula a .

E aqui está uma consulta em uma tabela de banco de dados.
SELECT 
  CatName,
  CatName LIKE 'br%'
FROM Cats;

Resultado:
CatName     CatName LIKE 'br%'
----------  ------------------
Brush       1                 
Brash       1                 
Broosh      1                 
100%Fluff   0                 
100$Fluff   0                 

Nesse caso, temos uma partida contra todos os gatos cujos nomes começam com Br , embora nossos critérios tenham usado um b minúsculo .

Exemplo que diferencia maiúsculas de minúsculas


Agora vamos ver o que acontece quando usamos o case_sensitive_like Declaração PRAGMA para habilitar a diferenciação entre maiúsculas e minúsculas no intervalo ASCII.
PRAGMA case_sensitive_like = 1;
SELECT 
  'a' LIKE 'A',
  'æ' LIKE 'Æ';

Resultado:
'a' LIKE 'A'  'æ' LIKE 'Æ'
------------  ------------
0             0           

Desta vez, o A maiúsculo não corresponda às letras minúsculas a .

E aqui está o exemplo de banco de dados depois de habilitar a diferenciação entre maiúsculas e minúsculas.
SELECT 
  CatName,
  CatName LIKE 'br%'
FROM Cats;

Resultado:
CatName     CatName LIKE 'br%'
----------  ------------------
Brush       0                 
Brash       0                 
Broosh      0                 
100%Fluff   0                 
100$Fluff   0                 

Observe que não precisei executar a instrução PRAGMA novamente. A configuração permanece em vigor para minha conexão até que eu a altere.

Desativar distinção entre maiúsculas e minúsculas


Aqui está um exemplo de como desabilitar a diferenciação entre maiúsculas e minúsculas e executar a consulta novamente.
PRAGMA case_sensitive_like = 0;
SELECT 
  CatName,
  CatName LIKE 'br%'
FROM Cats;

Resultado:
CatName     CatName LIKE 'br%'
----------  ------------------
Brush       1                 
Brash       1                 
Broosh      1                 
100%Fluff   0                 
100$Fluff   0                 

A função Like()


Conforme mencionado, o case_sensitive_like A instrução PRAGMA também afeta o like() função.
PRAGMA case_sensitive_like = 1;
SELECT 
  CatName,
  like('Br%', CatName),
  like('br%', CatName)
FROM Cats;

Resultado:
CatName     like('Br%', CatName)  like('br%', CatName)
----------  --------------------  --------------------
Brush       1                     0                   
Brash       1                     0                   
Broosh      1                     0                   
100%Fluff   0                     0                   
100$Fluff   0                     0                   

Operador LIKE com reconhecimento de Unicode


Você também pode usar a extensão SQLite ICU se precisar de um LIKE com reconhecimento de unicode operador.

A implementação de LIKE incluído nesta extensão usa a função ICU u_foldCase() para fornecer comparações independentes de maiúsculas e minúsculas para todo o intervalo de caracteres unicode.