sql >> Database >  >> RDS >> Oracle

4 manieren om rijen te vinden die hoofdletters bevatten in Oracle

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

Voorbeeldgegevens

Stel dat we een tabel hebben met de volgende gegevens:

SELECT c1 FROM t1;

Resultaat:

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

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

Optie 1:Vergelijk met een POSIX Character Class

Oracle's REGEXP_LIKE voorwaarde voldoet aan de POSIX-standaard voor reguliere expressies en de Unicode-richtlijnen voor reguliere expressies. We kunnen daarom de [:upper:] . gebruiken POSIX-tekenklasse om te controleren op hoofdletters:

SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[[:upper:]]');

Resultaat:

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

Optie 2:Vergelijk met de LOWER() Tekenreeks

We kunnen de LOWER() . gebruiken functie om de oorspronkelijke waarde te vergelijken met het equivalent in kleine letters:

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

Resultaat:

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).

Oracle voert standaard een hoofdlettergevoelige zoekopdracht uit, dus ik hoef niets anders aan de zoekopdracht te doen om deze hoofdlettergevoelig te maken.

Optie 3:Vergelijk met de werkelijke karakters

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

SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]', 'c');

Resultaat:

CAFÉ
Café
eCafé
James Bond 007
JB 007

De 'c' specificeert hoofdlettergevoelige en accentgevoelige overeenkomsten, zelfs als de vastgestelde sortering van de voorwaarde hoofdletterongevoelig of accentongevoelig is.

Deze keer worden er minder rijen geretourneerd dan in de vorige voorbeelden. Dat 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 moet je ervoor zorgen dat alle geldige tekens zijn gedekt als je deze optie gebruikt.

Hier is het weer met die twee karakters inbegrepen:

SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[ÉØABCDEFGHIJKLMNOPQRSTUVWXYZ]', 'c');

Resultaat:

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

Optie 4:vergelijken met een reeks tekens

Een andere manier om dit te doen is door het bereik van hoofdletters op te geven dat we willen matchen:

SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[A-Z]', 'c');

Resultaat:

CAFÉ
Café
eCafé
James Bond 007
JB 007

  1. Oracle SQL PIVOT-tabel

  2. Bindende variabele aan tabelnaam met cx_Oracle

  3. Is er een manier om een ​​vervaltijd in te stellen, waarna een gegevensinvoer automatisch wordt verwijderd in PostgreSQL?

  4. Wat is MySQL-rijvolgorde voor SELECT * FROM table_name;?