SQLite
 sql >> Database >  >> RDS >> SQLite

Come rendere l'operatore LIKE di SQLite con distinzione tra maiuscole e minuscole

Per impostazione predefinita, SQLite LIKE l'operatore non fa distinzione tra maiuscole e minuscole per i caratteri ASCII. Ciò significa che corrisponderà ai caratteri maiuscoli e minuscoli, indipendentemente da quale maiuscolo utilizzi nel tuo modello.

Tuttavia, esiste una tecnica che puoi utilizzare per fare distinzione tra maiuscole e minuscole.

SQLite ha un'istruzione PRAGMA chiamata case_sensitive_like , che è progettato per rendere specificamente il LIKE operatore con distinzione tra maiuscole e minuscole per i caratteri ASCII.

Il motivo per cui ho specificato "caratteri ASCII" è perché LIKE l'operatore fa distinzione tra maiuscole e minuscole per impostazione predefinita per i caratteri Unicode che sono oltre l'intervallo ASCII.

Pertanto, se hai bisogno del LIKE operatore per distinguere tra maiuscole e minuscole nell'intervallo ASCII, il case_sensitive_like La dichiarazione PRAGMA potrebbe essere quello che stai cercando.

Questo vale anche per like() funzione, che funziona esattamente come LIKE operatore.

Abilitazione/Disabilitazione della distinzione tra maiuscole e minuscole

Puoi utilizzare uno dei seguenti valori booleani per abilitare la distinzione tra maiuscole e minuscole:

1
on
true
yes

Puoi utilizzare uno dei seguenti valori booleani per disabilitare la distinzione tra maiuscole e minuscole:

0
off
false
no

L'argomento può essere tra parentesi o può essere separato dal nome pragma da un segno di uguale.

Gli argomenti delle parole chiave possono facoltativamente apparire tra virgolette.

Esempio senza distinzione tra maiuscole e minuscole

Per prima cosa vediamo cosa succede quando non utilizziamo il case_sensitive_like Dichiarazione PRAGMA.

SELECT 
  'a' LIKE 'A',
  'æ' LIKE 'Æ';

Risultato:

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

In questo caso, la prima colonna non fa distinzione tra maiuscole e minuscole:la A maiuscola corrisponde alla a minuscola .

Ed ecco una query su una tabella di database.

SELECT 
  CatName,
  CatName LIKE 'br%'
FROM Cats;

Risultato:

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

In questo caso, otteniamo una corrispondenza contro tutti i gatti i cui nomi iniziano con Br , anche se i nostri criteri utilizzavano una b minuscola .

Esempio case-sensitive

Ora vediamo cosa succede quando utilizziamo case_sensitive_like Istruzione PRAGMA per abilitare la distinzione tra maiuscole e minuscole nell'intervallo ASCII.

PRAGMA case_sensitive_like = 1;
SELECT 
  'a' LIKE 'A',
  'æ' LIKE 'Æ';

Risultato:

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

Quindi questa volta la A maiuscola non corrisponde alla a minuscola .

Ed ecco l'esempio del database dopo aver abilitato la distinzione tra maiuscole e minuscole.

SELECT 
  CatName,
  CatName LIKE 'br%'
FROM Cats;

Risultato:

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

Si noti che non avevo bisogno di eseguire nuovamente l'istruzione PRAGMA. L'impostazione rimane attiva per la mia connessione finché non la modifico.

Disabilita la distinzione tra maiuscole e minuscole

Ecco un esempio di disabilitazione della distinzione tra maiuscole e minuscole e di eseguire nuovamente la query.

PRAGMA case_sensitive_like = 0;
SELECT 
  CatName,
  CatName LIKE 'br%'
FROM Cats;

Risultato:

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

La funzione Like()

Come accennato, il case_sensitive_like L'istruzione PRAGMA ha effetto anche su like() funzione.

PRAGMA case_sensitive_like = 1;
SELECT 
  CatName,
  like('Br%', CatName),
  like('br%', CatName)
FROM Cats;

Risultato:

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

Operatore LIKE sensibile a Unicode

Puoi anche utilizzare l'estensione ICU SQLite se hai bisogno di un LIKE compatibile con unicode operatore.

L'implementazione di LIKE incluso in questa estensione utilizza la funzione ICU u_foldCase() per fornire confronti indipendenti tra maiuscole e minuscole per l'intera gamma di caratteri Unicode.