sql >> Databasteknik >  >> RDS >> SQLite

Hur man gör SQLites LIKE-operatör skiftlägeskänslig

Som standard är SQLite LIKE operatorn är skiftlägeskänslig för ASCII-tecken. Det betyder att den matchar versaler och gemener, oavsett vilket skiftläge du använder i ditt mönster.

Det finns dock en teknik du kan använda för att göra den skiftlägeskänslig.

SQLite har en PRAGMA-sats som heter casesensitive_like , som är utformad för att specifikt göra LIKE operatör skiftlägeskänslig för ASCII-tecken.

Anledningen till att jag anger "ASCII-tecken" är att LIKE operatorn är skiftlägeskänslig som standard för unicode-tecken som ligger utanför ASCII-intervallet.

Därför, om du behöver LIKE operatorn ska vara skiftlägeskänslig i ASCII-intervallet, case_sensitive_like PRAGMA-uttalande kan vara det du letar efter.

Detta gäller även för like() funktion, som fungerar exakt på samma sätt som LIKE operatör.

Aktivera/inaktivera skiftlägeskänslighet

Du kan använda något av följande booleska värden för att aktivera skiftlägeskänslighet:

1
on
true
yes

Du kan använda något av följande booleska värden för att inaktivera skiftlägeskänslighet:

0
off
false
no

Argumentet kan vara antingen inom parentes eller så kan det separeras från pragmans namn med ett likhetstecken.

Nyckelordsargument kan valfritt visas inom citattecken.

skiftlägeskänsligt exempel

Låt oss först se vad som händer när vi inte använder case_sensitive_like PRAGMA uttalande.

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

Resultat:

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

I det här fallet är den första kolumnen skiftlägesokänslig – versalerna A matchar gemener a .

Och här är en fråga mot en databastabell.

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

Resultat:

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

I det här fallet får vi en match mot alla katter vars namn börjar på Br , även om våra kriterier använde en liten b .

Skaftkänsligt exempel

Låt oss nu se vad som händer när vi använder case_sensitive_like PRAGMA-sats för att möjliggöra skiftlägeskänslighet i ASCII-intervallet.

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

Resultat:

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

Så den här gången versaler A gör inte matcha gemener a .

Och här är databasexemplet efter att ha aktiverat skiftlägeskänslighet.

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

Resultat:

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

Lägg märke till att jag inte behövde köra PRAGMA-satsen igen. Inställningen förblir på plats för min anslutning tills jag ändrar den.

Inaktivera skiftlägeskänslighet

Här är ett exempel på hur du inaktiverar skiftlägeskänslighet och kör frågan igen.

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

Resultat:

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

Like()-funktionen

Som nämnts, case_sensitive_like PRAGMA-satsen påverkar också like() funktion.

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

Resultat:

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-Aware LIKE-operatör

Du kan också använda SQLite ICU-tillägget om du behöver en unicode-medveten LIKE operatör.

Implementeringen av LIKE som ingår i detta tillägg använder ICU-funktionen u_foldCase() för att tillhandahålla kasusoberoende jämförelser för hela utbudet av unicode-tecken.


  1. MySQL:s alternativ till T-SQL:s MED BAND

  2. Varför rapporterar MySQL ett syntaxfel vid FULL OUTER JOIN?

  3. Hur man återställer MySQL eller MariaDB Root Password i Linux

  4. Hur OBJECTPROPERTYEX() fungerar i SQL Server