sql >> Databasteknik >  >> RDS >> SQLite

3 sätt att hitta rader som innehåller små bokstäver i SQLite

Här är tre alternativ för att returnera rader som innehåller gemener i SQLite.

Exempeldata

Anta att vi har en tabell med följande data:

.nullvalue null
SELECT c1 FROM t1;

Resultat:

c1            
--------------
CAFÉ          
Café          
café          
1café         
eCafé         
James Bond 007
JB 007        
007           
null          
              
É             
É 123         
é             
é 123         
ø             
Ø             

Vi kan använda följande metoder för att returnera de rader som innehåller gemener.

Alternativ 1:Jämför med UPPER() Sträng

Vi kan använda UPPER() funktion för att jämföra det ursprungliga värdet med dess motsvarighet i versaler:

SELECT c1 FROM t1
WHERE UPPER(c1) <> c1;

Resultat:

c1            
--------------
Café          
café          
1café         
eCafé         
James Bond 007

Genom att använda inte lika med (<> ) operator (du kan alternativt använda != istället för <> om du föredrar det), returnerar vi bara de rader som skiljer sig från sina versaler. Anledningen till att vi gör detta är att om ett värde är detsamma som dess versaler, så var det redan versaler till att börja med (och vi vill inte returnera det).

SQLite utför en skiftlägeskänslig sökning, så vi behöver inte göra något annat för att få det resultat vi önskar.

Du kanske har märkt att exemplet ovan inte returnerade de gemena unicode-tecknen é och ø såvida inte värdet också inkluderade en icke-unicode gemen bokstav. SQLite stöder inte unicode-tecken fullt ut. Till exempel, UPPER() och LOWER() Funktioner tillhandahåller endast case mappning för de 26 bokstäverna som används på engelska. Därför konverterade exemplet ovan inte några unicode-tecken till deras motsvarighet i versaler.

Ta en titt på SQLite ICU-tillägget om du behöver arbeta med unicode-tecken.

Alternativ 2:Jämför med de faktiska tecknen

Ett annat alternativ är att använda REGEXP operator med ett reguljärt uttrycksmönster som uttryckligen inkluderar varje gement tecken som vi vill matcha:

SELECT c1 FROM t1
WHERE c1 REGEXP '[abcdefghijklmnopqrstuvwxyz]';

Resultat:

c1            
--------------
Café          
café          
1café         
eCafé         
James Bond 007

Vi kan inkludera unicode-tecken i vår lista om vi vill:

SELECT c1 FROM t1
WHERE c1 REGEXP '[éøabcdefghijklmnopqrstuvwxyz]';

Resultat:

c1            
--------------
Café          
café          
1café         
eCafé         
James Bond 007
é             
é 123         
ø             

Alternativ 3:Jämför med en rad tecken

Ett annat sätt att göra det är att ange intervallet för gemener som vi vill matcha:

SELECT c1 FROM t1
WHERE c1 REGEXP '[a-z]';

Resultat:

c1            
--------------
Café          
café          
1café         
eCafé         
James Bond 007

  1. Hur man installerar den senaste MySQL 8 på Debian 10

  2. Prestandaöverraskningar och antaganden:STRING_SPLIT()

  3. Installera Percona XtraDB Cluster på CentOS 7

  4. Vad är det bästa sättet att paginera resultat i SQL Server