Här är fyra alternativ för att returnera rader som innehåller versaler i PostgreSQL.
Exempeldata
Anta att vi har en tabell med följande data:
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 en POSIX-teckenklass
Vi kan använda ~
operatorn för att utföra en skiftlägeskänslig matchning av ett reguljärt uttrycksmönster. Mönstret kan vara så enkelt eller komplext som vi vill.
Ett enkelt alternativ är att jämföra vår kolumn med [:upper:]
POSIX teckenklass:
SELECT c1 FROM t1
WHERE c1 ~ '[[:upper:]]';
Resultat:
c1 ---------------- CAFÉ Café eCafé James Bond 007 JB 007 É É 123 Ø
Alternativ 2:Jämför med LOWER()
Sträng
Ett annat alternativ är att 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 É É 123 Ø
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).
Som standard utför PostgreSQL en skiftlägeskänslig matchning, så vi behöver inte ange en skiftlägeskänslig sammanställning för att få det resultat vi önskar.
Alternativ 3:Jämför med de faktiska tecknen
Ett annat alternativ är att använda koden ~
operator med ett reguljärt uttrycksmönster som uttryckligen inkluderar varje versal som vi vill matcha:
SELECT c1 FROM t1
WHERE c1 ~ '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]';
Resultat:
c1 ---------------- CAFÉ Café eCafé James Bond 007 JB 007
I det här fallet returneras färre rader än i de tidigare exemplen. Detta beror på att jag inte angav tecken som É
och Ø
, som returnerades i dessa exempel. Vårt resultat innehåller É
men den raden returnerades bara eftersom den också innehåller andra versaler som gör match.
Därför är det här alternativet mer begränsat än det föregående, men det ger dig mer kontroll över de karaktärer du vill matcha.
Alternativ 4:Jämför med en rad tecken
Vi kan alternativt specificera intervallet av tecken vi vill matcha:
SELECT c1 FROM t1
WHERE c1 ~ '[A-Z]';
Resultat:
c1 ---------------- CAFÉ Café eCafé James Bond 007 JB 007