Mysql
 sql >> Base de données >  >> RDS >> Mysql

2 façons de renvoyer des lignes contenant uniquement des caractères non alphanumériques dans MySQL

Vous trouverez ci-dessous deux options pour rechercher les lignes qui ne contiennent que des caractères non alphanumériques dans MySQL.

Les caractères non alphanumériques incluent les caractères de ponctuation tels que [email protected]#&()–[{}]:;',?/* et des symboles comme `~$^+=<>“ , ainsi que des caractères d'espacement tels que les espaces ou les tabulations.

Exemple de données

Nous utiliserons les données suivantes pour nos exemples :

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;

Résultat :

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

Option 1 : Comparer avec [:alnum:]

Nous pouvons utiliser le REGEXP de MySQL opérateur pour comparer notre colonne à une expression régulière.

La capacité d'expression régulière de MySQL inclut la prise en charge des classes de caractères POSIX. Par conséquent, nous pouvons utiliser le [:alnum:] Classe de caractères POSIX dans nos expressions régulières pour trouver les lignes qui ne contiennent que des caractères alphanumériques, puis annulez cela avec le NOT opérateur.

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

Résultat :

+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
|                      |
+----------------------+

Si vous avez besoin d'exclure un caractère spécifique, vous pouvez toujours utiliser le NULLIF() une fonction.

Par exemple, excluons la chaîne vide de la dernière ligne :

SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';

Résultat :

+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
+----------------------+

Option 2 :Spécifiez une plage de caractères

Une autre façon de procéder consiste à spécifier une plage de caractères dans votre expression régulière.

Exemple :

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

Résultat :

+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
|                      |
| é                    |
| É                    |
| ø                    |
+----------------------+

Et pour supprimer la chaîne vide :

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

Résultat :

+----------------------+
| c1                   |
+----------------------+
| ()                   |
| [email protected]#&()–[{}]:;',?/*   |
| `~$^+=<>“            |
| é                    |
| É                    |
| ø                    |
+----------------------+

Dans ce cas, ma plage d'exclusion ne couvrait pas les caractères alphanumériques comme é , É , et ø , et la sortie n'est donc pas une représentation fidèle des caractères non alphanumériques. Cela dit, au moins cette méthode vous donne la possibilité de spécifier les caractères exacts que vous souhaitez inclure ou exclure du résultat.

Alternatives à REGEXP

Dans MySQL, le RLIKE et REGXP les opérateurs sont synonymes de REGEXP_LIKE() . Par conséquent, nous pouvons remplacer n'importe lequel des exemples précédents par NOT RLIKE ou NOT REGEXP_LIKE() .

Exemple de RLIKE :

SELECT c1 FROM t1 
WHERE c1 NOT RLIKE '[[:alnum:]]';

Exemple de REGEXP_LIKE() :

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