sql >> Databasteknik >  >> RDS >> PostgreSQL

4 sätt att hitta rader som innehåller versaler i PostgreSQL

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

  1. Beräkna skillnaden mellan 2 datum/tider i Oracle SQL

  2. Hur hämtar jag kommentaren från en PostgreSQL-databas?

  3. SCD typ 3

  4. En översikt över Percona XtraDB Cluster Kubernetes Operator