sql >> Database >  >> RDS >> PostgreSQL

4 manieren om rijen te vinden die hoofdletters bevatten in PostgreSQL

Hier zijn vier opties voor het retourneren van rijen die hoofdletters bevatten in PostgreSQL.

Voorbeeldgegevens

Stel dat we een tabel hebben met de volgende gegevens:

SELECT c1 FROM t1;

Resultaat:

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

We kunnen de volgende methoden gebruiken om de rijen die hoofdletters bevatten te retourneren.

Optie 1:Vergelijk met een POSIX Character Class

We kunnen de ~ . gebruiken operator om een ​​hoofdlettergevoelige overeenkomst van een reguliere expressiepatroon uit te voeren. Het patroon kan zo eenvoudig of complex zijn als we willen.

Een eenvoudige optie is om onze kolom te vergelijken met de [:upper:] POSIX-tekenklasse:

SELECT c1 FROM t1
WHERE c1 ~ '[[:upper:]]';

Resultaat:

       c1       
----------------
 CAFÉ
 Café
 eCafé
 James Bond 007
 JB 007
 É
 É 123
 Ø

Optie 2:Vergelijk met de LOWER() Tekenreeks

Een andere optie is om de LOWER() . te gebruiken functie om de oorspronkelijke waarde te vergelijken met het equivalent in kleine letters:

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

Resultaat:

       c1       
----------------
 CAFÉ
 Café
 eCafé
 James Bond 007
 JB 007
 É
 É 123
 Ø

Door het gebruik van de niet gelijk aan (<> ) operator (u kunt ook != in plaats van <> als je dat liever hebt), retourneren we alleen die rijen die verschillen van hun equivalenten in kleine letters. De reden dat we dit doen is omdat, als een waarde hetzelfde is als het equivalent in kleine letters, het al in kleine letters was (en we willen het niet teruggeven).

Standaard voert PostgreSQL een hoofdlettergevoelige overeenkomst uit, dus we hoeven geen hoofdlettergevoelige sortering op te geven om het gewenste resultaat te krijgen.

Optie 3:Vergelijk met de werkelijke karakters

Een andere optie is om de ~ . te gebruiken operator met een patroon voor reguliere expressies dat expliciet elk hoofdletter bevat dat we willen matchen:

SELECT c1 FROM t1
WHERE c1 ~ '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]';

Resultaat:

       c1       
----------------
 CAFÉ
 Café
 eCafé
 James Bond 007
 JB 007

In dit geval worden er minder rijen geretourneerd dan in de vorige voorbeelden. Dit komt omdat ik geen tekens zoals É . heb gespecificeerd en Ø , die in die voorbeelden werden geretourneerd. Ons resultaat bevat É maar die rij werd alleen geretourneerd omdat deze ook andere hoofdletters bevat die doen wedstrijd.

Daarom is deze optie beperkter dan de vorige, maar het geeft je wel meer controle over de karakters die je wilt matchen.

Optie 4:vergelijken met een reeks tekens

We kunnen ook het bereik van tekens specificeren dat we willen matchen:

SELECT c1 FROM t1
WHERE c1 ~ '[A-Z]';

Resultaat:

       c1       
----------------
 CAFÉ
 Café
 eCafé
 James Bond 007
 JB 007

  1. mysql, herhaal kolomnamen

  2. Proactieve SQL Server Health Checks, Deel 2:Onderhoud

  3. mySQL-gegevensbron op Visual Studio 2012

  4. SQL alles selecteren als parameter null is, anders specifiek item retourneren