sql >> Databáze >  >> RDS >> Mysql

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

Níže jsou uvedeny dvě možnosti, jak v MySQL najít ty řádky, které obsahují 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 VALUES
    ('Music'),
    ('Live Music'),
    ('Café'),
    ('Café Del Mar'),
    ('100 Cafés'),
    ('[email protected]'),
    ('1 + 1'),
    ('()'),
    ('[email protected]#&()–[{}]:;'',?/*'),
    ('`~$^+=<>“'),
    ('$1.50'),
    ('Player 456'),
    ('007'),
    (null),
    (''),
    ('é'),
    ('É'),
    ('é 123'),
    ('ø'),
    ('ø 123');
SELECT c1 FROM t1;

Výsledek:

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

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

Můžeme použít REGEXP MySQL operátor k porovnání našeho sloupce s regulárním výrazem.

Schopnost regulárních výrazů MySQL zahrnuje podporu pro znakové třídy 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 c1 REGEXP '^[[:alnum:]]+$';

Výsledek:

+-------+
| c1    |
+-------+
| 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.

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 c1 REGEXP '^[[:alnum:] ]+$';

Výsledek:

+---------------+
| c1            |
+---------------+
| 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 c1 REGEXP '[[:alnum:]]';

Výsledek:

+-------------------+
| c1                |
+-------------------+
| 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čete rozsah znaků

Dalším způsobem, jak to udělat, je poskytnout regulární výraz, který poskytuje řadu znaků. Stále můžeme používat REGEXP operátora.

Příklad:

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[A-Za-z0-9]+$';

Výsledek:

+-------+
| c1    |
+-------+
| Music |
| 007   |
+-------+

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.

Při zachování tohoto rozsahu však můžeme zahrnout mezery takto:

SELECT c1 FROM t1 
WHERE c1 REGEXP '^[A-Za-z0-9 ]+$';

Výsledek:

+------------+
| c1         |
+------------+
| Music      |
| Live Music |
| Player 456 |
| 007        |
+------------+

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 c1 REGEXP '[A-Za-z0-9]';

Výsledek:

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

Alternativy k REGEXP

V MySQL, RLIKE a REGXP operátory jsou synonyma pro REGEXP_LIKE() . Proto můžeme kterýkoli z předchozích příkladů nahradit RLIKE nebo REGEXP_LIKE() .

Příklad RLIKE :

SELECT c1 FROM t1 
WHERE c1 RLIKE '^[[:alnum:]]+$';

Příklad REGEXP_LIKE() :

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

  1. Nelegální mix porovnávání Chyba MySQL

  2. PostgreSQL funkce pro poslední vložené ID

  3. Nainstalujte webový server ve Windows XP s Apache2, PHP5 a MySQL4 – část 4

  4. Datový typ pro ukládání IP adresy na SQL Server