sql >> Databáze >  >> RDS >> Oracle

2 způsoby, jak vrátit řádky, které obsahují pouze alfanumerické znaky v Oracle

Níže jsou uvedeny dva způsoby vracení řádků, které v databázi Oracle obsahují pouze alfanumerické znaky.

Alfanumerické znaky jsou abecední znaky a číselné znaky.

Ukázková data

Pro naše příklady použijeme následující data:

CREATE TABLE t1 (
    c1 varchar(255) NULL
    );

INSERT INTO t1 (c1) 
    WITH c AS (
        SELECT 'Music' FROM DUAL UNION ALL
        SELECT 'Live Music' FROM DUAL UNION ALL
        SELECT 'Café' FROM DUAL UNION ALL
        SELECT 'Café Del Mar' FROM DUAL UNION ALL
        SELECT '100 Cafés' FROM DUAL UNION ALL
        SELECT '[email protected]' FROM DUAL UNION ALL
        SELECT '1 + 1' FROM DUAL UNION ALL
        SELECT '()' FROM DUAL UNION ALL
        SELECT '[email protected]#&()–[{}]:;'',?/*' FROM DUAL UNION ALL
        SELECT '`~$^+=<>“' FROM DUAL UNION ALL
        SELECT '$1.50' FROM DUAL UNION ALL
        SELECT 'Player 456' FROM DUAL UNION ALL
        SELECT '007' FROM DUAL UNION ALL
        SELECT 'é' FROM DUAL UNION ALL
        SELECT 'É' FROM DUAL UNION ALL
        SELECT 'é 123' FROM DUAL UNION ALL
        SELECT 'ø' FROM DUAL UNION ALL
        SELECT 'ø 123' FROM DUAL)
SELECT * FROM c;

SELECT c1 FROM t1;

Výsledek:

Music
Live Music
Café
Café Del Mar
100 Cafés
[email protected]
1 + 1
()
[email protected]#&()–[{}]:;',?/*
`~$^+=<>“
$1.50
Player 456
007
é
É
é 123
ø
ø 123

Možnost 1:Porovnat s [:alnum:]

Můžeme použít REGEXP_LIKE() Oracle funkce pro porovnání hodnoty s regulárním výrazem.

Schopnost regulárních výrazů Oracle zahrnuje podporu pro třídy znaků POSIX. Proto můžeme použít [:alnum:] Třída znaků POSIX v našich regulárních výrazech, abyste našli řádky, které obsahují alfanumerické znaky.

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[[:alnum:]]+$');

Výsledek:

Music
Café
007
é
É
ø

To vrátilo pouze ty řádky, které neobsahují nic jiného než alfanumerické znaky. Pokud řádek obsahuje alfanumerické i nealfanumerické znaky, nebude vrácen.

Všimněte si, že znak mezery je považován za nealfanumerický, a pokud tedy chceme zahrnout mezery, můžeme to udělat takto:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[[:alnum:] ]+$');

Výsledek:

Music
Live Music
Café
Café Del Mar
100 Cafés
Player 456
007
é
É
é 123
ø
ø 123

Chcete-li vrátit všechny řádky, které obsahují alfanumerické znaky (i když řádek obsahuje i jiné než alfanumerické znaky), můžeme provést toto:

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

Výsledek:

Music
Live Music
Café
Café Del Mar
100 Cafés
[email protected]
1 + 1
$1.50
Player 456
007
é
É
é 123
ø
ø 123

Možnost 2:Určení rozsahu znaků

Dalším způsobem, jak to udělat, je zadat rozsah znaků v regulárním výrazu.

Příklad:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[A-Za-z0-9]+$');

Výsledek:

Music
007

Všimnete si, že to vrátilo méně řádků než v našem prvním příkladu. Je to proto, že jsem nezahrnul é , É , nebo ø znaky v mém rozsahu, a tak jsou z výstupu vyloučeny všechny řádky, které tyto znaky obsahují.

Proto musíte být při používání této metody opatrní pro případ, že byste omylem vyloučili znaky, které byste měli zahrnout.

Zde je to opět s rozsahem, který tyto znaky zahrnuje:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9]+$');

Výsledek:

Music
Café
007
é
É
ø

Můžeme zahrnout mezery takto:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '^[A-Za-zÀ-Þß-ÿ0-9 ]+$');

Výsledek:

Music
Live Music
Café
Café Del Mar
100 Cafés
Player 456
007
é
É
é 123
ø
ø 123

A pomocí následujícího můžeme zahrnout všechny řádky, které obsahují znaky z našeho rozsahu (i když také obsahují znaky mimo tento rozsah):

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '[A-Za-zÀ-Þß-ÿ0-9]');

Výsledek:

Music
Live Music
Café
Café Del Mar
100 Cafés
[email protected]
1 + 1
$1.50
Player 456
007
é
É
é 123
ø
ø 123

Nebo pokud nechceme zahrnout tyto znaky Unicode, můžeme to zjednodušit na toto:

SELECT c1 FROM t1 
WHERE REGEXP_LIKE(c1, '[A-Za-z0-9]');

Výsledek:

Music
Live Music
Café
Café Del Mar
100 Cafés
[email protected]
1 + 1
$1.50
Player 456
007
é 123
ø 123

To nevylučuje tyto unicode znaky z výstupu, pokud náhodou sdílejí řádek s alfanumerickými znaky.


  1. Odstraňování problémů s docházejícími pracovními vlákny

  2. Jak vytvořit dočasnou tabulku v SQL?

  3. Jak zkontrolovat velikost databáze v MySQL

  4. Kód chyby:2013. Při dotazu došlo ke ztrátě připojení k serveru MySQL