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

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

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

Los caracteres alfanuméricos son caracteres alfabéticos y caracteres numéricos.

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 caracteres alfanuméricos.

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

Resultado:

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

Eso devolvió solo aquellas filas que contienen nada más que caracteres alfanuméricos. Si una fila contiene caracteres alfanuméricos y no alfanuméricos, no se devuelve.

El carácter de espacio se considera no alfanumérico, por lo que si queremos incluir espacios, podemos hacer esto:

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

Resultado:

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

Para devolver todas las filas que contienen caracteres alfanuméricos (incluso si la fila también contiene caracteres no alfanuméricos), podemos hacer esto:

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

Resultado:

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

Opción 2:especificar un rango de caracteres

Otra forma de hacerlo es proporcionar una expresión regular que proporcione un rango de caracteres. Todavía podemos usar el REGEXP operador para hacer esto.

Ejemplo:

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

Resultado:

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

Esto devolvió menos filas que con nuestro primer ejemplo. Eso es porque no incluí el é , É , o ø caracteres en mi rango, por lo que cualquier fila que contenga esos caracteres se excluye de la salida.

Por lo tanto, deberá tener cuidado al usar este método, en caso de que excluya accidentalmente caracteres que debería incluir.

Sin embargo, manteniendo este rango, podemos incluir espacios como este:

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

Resultado:

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

Y podemos usar lo siguiente para incluir todas las filas que contienen caracteres de nuestro rango (incluso si también contienen caracteres fuera de este rango):

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

Resultado:

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

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 RLIKE o REGEXP_LIKE() .

Ejemplo de RLIKE :

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

Ejemplo de REGEXP_LIKE() :

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