Här är tre alternativ för att returnera rader som innehåller versaler 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 versaler.
Alternativ 1:Jämför med LOWER()
Sträng
Vi kan använda LOWER()
funktion för att jämföra det ursprungliga värdet med dess gemener:
SELECT c1 FROM t1
WHERE LOWER(c1) <> c1;
Resultat:
c1 -------------- CAFÉ Café eCafé James Bond 007 JB 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 deras gemener. Anledningen till att vi gör detta är att om ett värde är detsamma som dess gemener, så var det redan gemener 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 stora unicode-tecknen É
och Ø
såvida inte värdet också inkluderade en icke-unicode versalbokstav. SQLite stöder inte unicode-tecken fullt ut. Till exempel, LOWER()
och UPPER()
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 motsvarande gemener.
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 versaltecken som vi vill matcha:
SELECT c1 FROM t1
WHERE c1 REGEXP '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]';
Resultat:
c1 -------------- CAFÉ Café eCafé James Bond 007 JB 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é eCafé James Bond 007 JB 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 versaler som vi vill matcha:
SELECT c1 FROM t1
WHERE c1 REGEXP '[A-Z]';
Resultat:
c1 -------------- CAFÉ Café eCafé James Bond 007 JB 007