Zde jsou čtyři možnosti pro vrácení řádků, které obsahují malá písmena v databázi Oracle.
Ukázková data
Předpokládejme, že máme tabulku s následujícími údaji:
SELECT c1 FROM t1;
Výsledek:
CAFÉ Café café 1café eCafé James Bond 007 JB 007 007 É É 123 é é 123 ø Ø
K vrácení řádků, které obsahují velká písmena, můžeme použít následující metody.
Možnost 1:Porovnání s třídou znaků POSIX
REGEXP_LIKE
společnosti Oracle podmínka vyhovuje standardu regulárních výrazů POSIX a směrnicím Unicode pro regulární výrazy. Můžeme proto použít [:lower:]
Třída znaků POSIX pro kontrolu malých písmen:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[[:lower:]]');
Výsledek:
Café café 1café eCafé James Bond 007 é é 123 ø
Možnost 2:Porovnejte s UPPER()
Řetězec
Můžeme použít UPPER()
funkce pro porovnání původní hodnoty s jejím ekvivalentem velkým písmenem:
SELECT c1 FROM t1
WHERE UPPER(c1) <> c1;
Výsledek:
Café café 1café eCafé James Bond 007 é é 123 ø
Pomocí nerovná se (<>
) operátor (můžete také použít !=
místo <>
pokud chcete), vracíme pouze ty řádky, které se liší od jejich ekvivalentů velkými písmeny. Důvod, proč to děláme, je ten, že pokud je hodnota stejná jako její ekvivalent velkými písmeny, pak již byla na začátku velká (a my ji nechceme vracet).
Ve výchozím nastavení Oracle provádí vyhledávání rozlišující malá a velká písmena, a proto nemusím s dotazem dělat nic jiného, aby se rozlišovala malá a velká písmena.
Možnost 3:Porovnejte se skutečnými postavami
Další možností je použít REGEXP_LIKE
podmínku se vzorem regulárního výrazu, který explicitně zahrnuje každý malý znak, který chceme porovnat:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[abcdefghijklmnopqrstuvwxyz]', 'c');
Výsledek:
Café café 1café eCafé James Bond 007
'c'
specifikuje shodu rozlišující malá a velká písmena a zvýraznění, i když určené řazení podmínky nerozlišuje velká a malá písmena nebo zvýraznění.
Tentokrát je vráceno méně řádků než v předchozích příkladech. Je to proto, že jsem nespecifikoval znaky jako é
a ø
, které byly vráceny v těchto příkladech. Náš výsledek obsahuje é
ale tento řádek byl vrácen pouze proto, že obsahuje i jiná malá písmena, která dělají zápas.
Pokud tedy použijete tuto možnost, musíte se ujistit, že máte pokryty všechny platné znaky.
Zde je to znovu s těmito dvěma zahrnutými znaky:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[éøabcdefghijklmnopqrstuvwxyz]', 'c');
Výsledek:
Café café 1café eCafé James Bond 007 é é 123 ø
Možnost 4:Porovnejte s řadou znaků
Dalším způsobem, jak to udělat, je zadat rozsah velkých písmen, které chceme porovnat:
SELECT c1 FROM t1
WHERE REGEXP_LIKE(c1, '[a-z]', 'c');
Výsledek:
Café café 1café eCafé James Bond 007