sql >> Database >  >> RDS >> SQLite

Hoe de LIKE-operator van SQLite hoofdlettergevoelig te maken?

Standaard is de SQLite LIKE operator is niet hoofdlettergevoelig voor ASCII-tekens. Dit betekent dat het overeenkomt met hoofdletters en kleine letters, ongeacht welke hoofdletters je in je patroon gebruikt.

Er is echter een techniek die u kunt gebruiken om het hoofdlettergevoelig te maken.

SQLite heeft een PRAGMA-instructie met de naam case_sensitive_like , die speciaal is ontworpen om de LIKE operator hoofdlettergevoelig voor ASCII-tekens.

De reden dat ik "ASCII-tekens" specificeer, is omdat de LIKE operator is standaard hoofdlettergevoelig voor Unicode-tekens die buiten het ASCII-bereik vallen.

Daarom, als je de LIKE . nodig hebt operator om hoofdlettergevoelig te zijn in het ASCII-bereik, de case_sensitive_like PRAGMA-verklaring zou kunnen zijn wat u zoekt.

Dit geldt ook voor de like() functie, die precies hetzelfde werkt als de LIKE telefoniste.

Hoofdlettergevoeligheid in-/uitschakelen

U kunt elk van de volgende booleaanse waarden gebruiken om hoofdlettergevoeligheid in te schakelen:

1
on
true
yes

U kunt elk van de volgende booleaanse waarden gebruiken om hoofdlettergevoeligheid uit te schakelen:

0
off
false
no

Het argument kan tussen haakjes staan ​​of het kan worden gescheiden van de pragmanaam door een gelijkteken.

Zoekwoordargumenten kunnen optioneel tussen aanhalingstekens worden weergegeven.

Hoofdlettergevoelig voorbeeld

Laten we eerst eens kijken wat er gebeurt als we de case_sensitive_like . niet gebruiken PRAGMA-verklaring.

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

Resultaat:

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

In dit geval is de eerste kolom niet hoofdlettergevoelig – de hoofdletter A komt overeen met de kleine letter a .

En hier is een query op een databasetabel.

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

Resultaat:

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

In dit geval krijgen we een match tegen alle katten wiens namen beginnen met Br , ook al gebruikten onze criteria een kleine letter b .

Hoofdlettergevoelig voorbeeld

Laten we nu eens kijken wat er gebeurt als we de case_sensitive_like . gebruiken PRAGMA-statement om hoofdlettergevoeligheid in het ASCII-bereik mogelijk te maken.

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

Resultaat:

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

Dus deze keer de hoofdletter A doet niet match de kleine letters a .

En hier is het databasevoorbeeld nadat hoofdlettergevoeligheid is ingeschakeld.

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

Resultaat:

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

Merk op dat ik de PRAGMA-verklaring niet opnieuw hoefde uit te voeren. De instelling blijft van kracht voor mijn verbinding totdat ik deze wijzig.

Hoofdlettergevoeligheid uitschakelen

Hier is een voorbeeld van het uitschakelen van hoofdlettergevoeligheid en het opnieuw uitvoeren van de query.

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

Resultaat:

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

De Like()-functie

Zoals gezegd, de case_sensitive_like PRAGMA-instructie heeft ook invloed op de like() functie.

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

Resultaat:

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

Unicode-bewuste LIKE-operator

U kunt ook de SQLite ICU-extensie gebruiken als u een unicode-bewuste LIKE . nodig heeft exploitant.

De implementatie van LIKE opgenomen in deze extensie gebruikt de ICU-functie u_foldCase() om hoofdletteronafhankelijke vergelijkingen te bieden voor het volledige bereik van Unicode-tekens.


  1. MySQL-TEKST versus BLOB versus CLOB

  2. Load Balancers vergelijken voor PostgreSQL

  3. Opgeslagen procedure aanroepen met retourwaarde

  4. Dubbele rijen verwijderen in SQL Server