sql >> Databasteknik >  >> RDS >> Oracle

4 sätt att hitta rader som innehåller små bokstäver i Oracle

Här är fyra alternativ för att returnera rader som innehåller gemener i Oracle Database.

Exempeldata

Anta att vi har en tabell med följande data:

SELECT c1 FROM t1;

Resultat:

CAFÉ
Café
café
1café
eCafé
James Bond 007
JB 007
007
É
É 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

Oracles REGEXP_LIKE villkoret följer POSIX standarden för reguljära uttryck och Unicodes riktlinjer för reguljära uttryck. Vi kan därför använda [:lower:] POSIX-teckenklass för att söka efter gemener:

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

Resultat:

Café
café
1café
eCafé
James Bond 007
é
é 123
ø

Alternativ 2:Jämför med UPPER() Sträng

Vi kan använda UPPER() funktion för att jämföra det ursprungliga värdet med dess motsvarighet i versaler:

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

Resultat:

Café
café
1café
eCafé
James Bond 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 sina versaler. Anledningen till att vi gör detta är att om ett värde är detsamma som dess versaler, så var det redan versaler till att börja med (och vi vill inte returnera det).

Som standard utför Oracle en skiftlägeskänslig sökning, så jag behöver inte göra något mer med frågan för att göra den skiftlägeskänslig.

Alternativ 3:Jämför med de faktiska tecknen

Ett annat alternativ är att använda REGEXP_LIKE villkor med ett reguljärt uttrycksmönster som uttryckligen inkluderar alla gemener som vi vill matcha:

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

Resultat:

Café
café
1café
eCafé
James Bond 007

'c' anger skiftlägeskänslig och accentkänslig matchning, även om den fastställda sammanställningen av villkoret är skiftlägesokänslig eller accentokänslig.

Denna gång returneras färre rader än i de tidigare exemplen. Det 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 gemener som gör match.

Därför måste du se till att du har alla giltiga tecken täckta om du använder det här alternativet.

Här är den igen med de två karaktärerna inkluderade:

SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[éøabcdefghijklmnopqrstuvwxyz]', 'c');

Resultat:

Café
café
1café
eCafé
James Bond 007
é
é 123
ø

Alternativ 4:Jämför med en rad tecken

Ett annat sätt att göra det är att ange intervallet för versaler som vi vill matcha:

SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[a-z]', 'c');

Resultat:

Café
café
1café
eCafé
James Bond 007

  1. Anslut till SQL Server via PDO med SQL Server Driver

  2. Skickar en varchar full av kommaavgränsade värden till en SQL Server IN-funktion

  3. Vad betyder det att använda parenteser med ett OR i SQL?

  4. Anslutningssträngparametrar för sparade specifikationer