Hier zijn vier opties voor het retourneren van rijen die hoofdletters bevatten in MariaDB.
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-tekenklasse
We kunnen de REGEXP
. gebruiken operator om een overeenkomst met een patroon voor reguliere expressies uit te voeren.
Een eenvoudige optie is om onze kolom te vergelijken met de [:upper:]
POSIX-tekenklasse:
SELECT c1 FROM t1
WHERE c1 REGEXP '[[:upper:]]';
Resultaat:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | | É | | É 123 | | Ø | +----------------+
RLIKE
is een synoniem voor REGEXP
, zodat we REGEXP
. kunnen vervangen met RLIKE
om hetzelfde resultaat te krijgen:
SELECT c1 FROM t1
WHERE c1 RLIKE '[[:upper:]]';
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 BINARY LOWER(c1) <> BINARY 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 MariaDB een hoofdletterongevoelige zoekopdracht uit en daarom gebruik ik de BINARY
operator om hoofdlettergevoelig te zoeken.
Dit kan ook als volgt worden gedaan:
SELECT c1 FROM t1
WHERE BINARY(LOWER(c1)) <> BINARY(c1);
Optie 3:Vergelijk met de werkelijke karakters
Een andere optie is om de REGEXP
. te gebruiken operator met een patroon voor reguliere expressies dat expliciet elk hoofdletter bevat dat we willen matchen:
SELECT c1 FROM t1
WHERE BINARY c1 REGEXP BINARY '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]';
Resultaat:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | +----------------+
Deze keer worden er minder rijen geretourneerd dan in de vorige voorbeelden. Dat komt omdat ik geen tekens heb gespecificeerd zoals É
en Ø
, die in het vorige voorbeeld zijn geretourneerd. Ons resultaat bevat É
maar die rij werd alleen geretourneerd omdat deze ook andere hoofdletters bevat die doen wedstrijd.
Daarom moet je ervoor zorgen dat alle geldige tekens zijn gedekt als je deze optie gebruikt.
Optie 4:vergelijken met een reeks tekens
Een andere manier om dit te doen, is door het bereik van tekens op te geven dat we willen matchen:
SELECT c1 FROM t1
WHERE BINARY c1 REGEXP BINARY '[A-Z]';
Resultaat:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | +----------------+