sql >> Base de Datos >  >> RDS >> Oracle

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

A continuación se muestran dos métodos para devolver filas que solo contienen caracteres no alfanuméricos en Oracle Database.

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 (c1) 
    WITH c AS (
        SELECT 'Music' FROM DUAL UNION ALL
        SELECT 'Live Music' FROM DUAL UNION ALL
        SELECT 'Café' FROM DUAL UNION ALL
        SELECT 'Café Del Mar' FROM DUAL UNION ALL
        SELECT '100 Cafés' FROM DUAL UNION ALL
        SELECT '[email protected]' FROM DUAL UNION ALL
        SELECT '1 + 1' FROM DUAL UNION ALL
        SELECT '()' FROM DUAL UNION ALL
        SELECT '[email protected]#&()–[{}]:;'',?/*' FROM DUAL UNION ALL
        SELECT '`~$^+=<>“' FROM DUAL UNION ALL
        SELECT '$1.50' FROM DUAL UNION ALL
        SELECT 'Player 456' FROM DUAL UNION ALL
        SELECT '007' FROM DUAL UNION ALL
        SELECT 'é' FROM DUAL UNION ALL
        SELECT 'É' FROM DUAL UNION ALL
        SELECT 'é 123' FROM DUAL UNION ALL
        SELECT 'ø' FROM DUAL UNION ALL
        SELECT 'ø 123' FROM DUAL)
SELECT * FROM c;

SELECT c1 FROM t1;

Resultado:

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

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

Podemos usar REGEXP_LIKE() de Oracle para comparar el valor con una expresión regular, luego negarlo con NOT operador.

La capacidad de expresión regular de Oracle 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 no alfanuméricos.

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

Resultado:

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

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

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 NOT REGEXP_LIKE(c1, '[A-Za-z0-9]');

Resultado:

()
[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.

Aquí hay un ejemplo de cómo expandir el rango para excluir esos caracteres de la salida:

SELECT c1 FROM t1 
WHERE NOT REGEXP_LIKE(c1, '[A-Za-zÀ-Þß-ÿ0-9]');

Resultado:

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