sql >> Database >  >> RDS >> Mysql

2 manieren om rijen met alfanumerieke tekens terug te geven in MySQL

Hieronder staan ​​twee opties om die rijen te vinden die alfanumerieke tekens bevatten in MySQL.

Alfanumerieke tekens zijn alfabetische tekens en numerieke tekens.

Voorbeeldgegevens

We gebruiken de volgende gegevens voor onze voorbeelden:

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;

Resultaat:

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

Optie 1:Vergelijk met [:alnum:]

We kunnen MySQL's REGEXP . gebruiken operator om onze kolom te vergelijken met een reguliere expressie.

De reguliere expressiemogelijkheid van MySQL omvat ondersteuning voor de POSIX-tekenklassen. Daarom kunnen we de [:alnum:] . gebruiken POSIX-tekenklasse in onze reguliere expressies om de rijen te vinden die alfanumerieke tekens bevatten.

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

Resultaat:

+-------+
| c1    |
+-------+
| Music |
| Café  |
| 007   |
| é     |
| É     |
| ø     |
+-------+

Dat leverde alleen die rijen op die alleen alfanumerieke tekens bevatten. Als een rij zowel alfanumerieke als niet-alfanumerieke tekens bevat, wordt deze niet geretourneerd.

Het spatieteken wordt als niet-alfanumeriek beschouwd, dus als we spaties willen opnemen, kunnen we dit doen:

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

Resultaat:

+---------------+
| c1            |
+---------------+
| Music         |
| Live Music    |
| Café          |
| Café Del Mar  |
| 100 Cafés     |
| Player 456    |
| 007           |
| é             |
| É             |
| é 123         |
| ø             |
| ø 123         |
+---------------+

Alle rijen retourneren die bevatten alfanumerieke tekens (zelfs als de rij ook niet-alfanumerieke tekens bevat), kunnen we dit doen:

SELECT c1 FROM t1 
WHERE c1 REGEXP '[[:alnum:]]';

Resultaat:

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

Optie 2:specificeer een reeks tekens

Een andere manier om dit te doen, is door een reguliere expressie aan te bieden die een reeks tekens biedt. We kunnen nog steeds de REGEXP . gebruiken operator om dit te doen.

Voorbeeld:

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

Resultaat:

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

Dit leverde minder rijen op dan bij ons eerste voorbeeld. Dat komt omdat ik de é . niet heb opgenomen , É , of ø tekens in mijn bereik, en dus worden alle rijen die deze tekens bevatten uitgesloten van de uitvoer.

Daarom moet u voorzichtig zijn bij het gebruik van deze methode, voor het geval u per ongeluk tekens uitsluit die u zou moeten opnemen.

Binnen dit bereik kunnen we echter spaties als deze opnemen:

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

Resultaat:

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

En we kunnen het volgende gebruiken om alle rijen op te nemen die bevatten tekens uit ons assortiment (zelfs als ze ook tekens buiten dit bereik bevatten):

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

Resultaat:

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

Alternatieven voor REGEXP

In MySQL is de RLIKE en REGXP operators zijn synoniemen voor REGEXP_LIKE() . Daarom kunnen we elk van de voorgaande voorbeelden vervangen door RLIKE of REGEXP_LIKE() .

Voorbeeld van RLIKE :

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

Voorbeeld van REGEXP_LIKE() :

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

  1. '0000-00-00 00:00:00' kan niet worden weergegeven als java.sql.Timestamp-fout

  2. Wat is het verschil tussen MyISAM en InnoDB?

  3. 3 manieren om alle opgeslagen procedures in een PostgreSQL-database op te sommen

  4. Converteer minuten naar HH24:MI-formaat