sql >> Base de Datos >  >> RDS >> Mysql

2 formas de devolver filas que contienen solo caracteres no alfanuméricos en MySQL

A continuación hay dos opciones para encontrar esas filas que solo contienen caracteres no alfanuméricos en MySQL.

Los caracteres no alfanuméricos incluyen caracteres de puntuación como [email protected]#&()–[{}]:;',?/* y símbolos como `~$^+=<>“ , así como caracteres de espacio en blanco como el espacio o los tabuladores.

Datos de muestra

Usaremos los siguientes datos para nuestros ejemplos:

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;

Resultado:

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

Opción 1:comparar con [:alnum:]

Podemos usar REGEXP de MySQL operador para comparar nuestra columna con una expresión regular.

La capacidad de expresión regular de MySQL incluye soporte para las clases de caracteres POSIX. Por lo tanto, podemos usar el [:alnum:] Clase de caracteres POSIX en nuestras expresiones regulares para encontrar las filas que contienen solo caracteres alfanuméricos, luego anule eso con NOT operador.

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

Resultado:

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

Si necesita excluir un carácter específico, siempre puede usar NULLIF() función.

Por ejemplo, excluyamos la cadena vacía de la última fila:

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

Resultado:

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

Opción 2:especificar un rango de caracteres

Otra forma de hacerlo es especificar un rango de caracteres dentro de su expresión regular.

Ejemplo:

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

Resultado:

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

Y para eliminar la cadena vacía:

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

Resultado:

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

En este caso, mi rango de exclusión no cubría caracteres alfanuméricos como é , É , y ø , por lo que la salida no es una representación real de caracteres no alfanuméricos. Dicho esto, al menos este método te da la opción de especificar los caracteres exactos que quieres incluir o excluir del resultado.

Alternativas a REGEXP

En MySQL, el RLIKE y REGXP los operadores son sinónimos de REGEXP_LIKE() . Por tanto, podemos sustituir cualquiera de los ejemplos anteriores por NOT RLIKE o NOT REGEXP_LIKE() .

Ejemplo de RLIKE :

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

Ejemplo de REGEXP_LIKE() :

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