¿Cómo podría eliminar todos los caracteres que no son alfabéticos de una cadena?
¿Qué pasa con los no alfanuméricos?
¿Tiene que ser una función personalizada o también hay soluciones más generalizables?
sql-server
parsing
user-defined-functions
alphanumeric
alphabetic
Incluso Mien
fuente
fuente
Versión parametrizada de la increíble respuesta de G Mastros :
Solo alfabético:
Solo numérico:
Alfanumérico solamente:
No alfanumérico:
fuente
SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^a-z0-9\s')
que todavía elimina los espacios en blanco. También intenté usar,[[:blank:]]
pero eso rompe la función y no se elimina nada de la cadena. Lo más cercano que he conseguido es mediante el uso de:SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^a-z0-9 ')
(codificar un espacio en el patrón de expresiones regulares). Sin embargo, eso no elimina los saltos de línea.SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^ a-z0-9')
Lo creas o no, en mi sistema esta función fea funciona mejor que la elegante de G Mastros.
fuente
ASCII
entero aquí y compara directamente la salida deSUBSTRING
algunos caracteres, por ejemplo:SET @ch=SUBSTRING(@s, @p, 1)
yIF @ch BETWEEN '0' AND '9' OR @ch BETWEEN 'a' AND 'z' OR @ch BETWEEN 'A' AND 'Z' ...
Sabía que SQL era malo en la manipulación de cadenas, pero no pensé que sería tan difícil. Aquí hay una función simple para eliminar todos los números de una cadena. Habría mejores formas de hacer esto, pero este es un comienzo.
Salida
Ronda 2 - Lista negra basada en datos
Salida
Mi desafío para los lectores: ¿Puedes hacer esto más eficiente? ¿Qué pasa con el uso de la recursividad?
fuente
Si es como yo y no tiene acceso para agregar funciones a sus datos de producción, pero aún desea realizar este tipo de filtrado, aquí hay una solución SQL pura que utiliza una tabla PIVOT para volver a unir las piezas filtradas.
Nota : codifiqué la tabla con hasta 40 caracteres, tendrá que agregar más si tiene cadenas más largas para filtrar.
fuente
Después de analizar todas las soluciones dadas, pensé que tenía que haber un método SQL puro que no requiriera una función o una consulta CTE / XML, y que no implique dificultades para mantener las instrucciones REPLACE anidadas. Aquí está mi solución:
La ventaja de hacerlo de esta manera es que los caracteres válidos están contenidos en una cadena en la subconsulta, lo que facilita la reconfiguración para un conjunto diferente de caracteres.
La desventaja es que debe agregar una fila de SQL para cada carácter hasta el tamaño de su columna. Para facilitar esa tarea, solo utilicé el script de Powershell a continuación, este ejemplo si es para un VARCHAR (64):
fuente
Aquí hay otra forma de eliminar caracteres no alfabéticos usando un
iTVF
. Primero, necesita un divisor de cadena basado en patrones. Aquí hay uno tomado del artículo de Dwain Camp :Ahora que tiene un divisor basado en patrones, debe dividir las cadenas que coinciden con el patrón:
y luego los concatena para obtener el resultado deseado:
MUESTRA
Resultado:
fuente
Esta solución, inspirada en la solución del Sr. Allen, requiere una
Numbers
tabla de enteros (que debe tener a mano si desea realizar operaciones de consulta serias con buen rendimiento). No requiere un CTE. Puede cambiar laNOT IN (...)
expresión para excluir caracteres específicos, o cambiarla a una expresiónIN (...)
ORLIKE
para retener solo ciertos caracteres.fuente
Aquí hay una solución que no requiere crear una función o enumerar todas las instancias de caracteres para reemplazar. Utiliza una instrucción WITH recursiva en combinación con un PATINDEX para encontrar caracteres no deseados. Reemplazará todos los caracteres no deseados en una columna: hasta 100 caracteres incorrectos únicos contenidos en cualquier cadena dada. (Por ejemplo, "ABC123DEF234" contendría 4 caracteres incorrectos 1, 2, 3 y 4) El límite de 100 es el número máximo de recursiones permitidas en una instrucción WITH, pero esto no impone un límite en el número de filas para procesar, que solo está limitado por la memoria disponible.
Si no desea resultados DISTINCT, puede eliminar las dos opciones del código.
fuente
Puse esto en ambos lugares donde se llama PatIndex.
para la función personalizada anterior EliminarNonAlphaCharacters y renombrarla EliminarNonAlphaNumericCharacters
fuente
- Primero crea una función
Ahora llame a esta función como
Su resultado como
fuente
Desde la perspectiva del rendimiento, usaría la función en línea:
fuente
Aquí hay otra solución recursiva de CTE, basada en la respuesta de @Gerhard Weiss aquí . Debería poder copiar y pegar todo el bloque de código en SSMS y jugar con él allí. Los resultados incluyen algunas columnas adicionales para ayudarnos a comprender lo que está sucediendo. Me tomó un tiempo hasta que entendí todo lo que estaba sucediendo con PATINDEX (RegEx) y el CTE recursivo.
fuente
Usando una tabla de números generados por CTE para examinar cada carácter, luego FOR XML para concatenar a una cadena de valores guardados puede ...
fuente
fuente
de esta manera no funcionó para mí, ya que estaba tratando de mantener las letras árabes, intenté reemplazar la expresión regular pero tampoco funcionó. Escribí otro método para trabajar en el nivel ASCII, ya que era mi única opción y funcionó.
VAMOS
fuente
Aunque la publicación es un poco antigua, me gustaría decir lo siguiente. El problema que tuve con la solución anterior es que no filtra caracteres como ç, ë, ï, etc. Adapté una función de la siguiente manera (solo usé una cadena de 80 varchar para guardar memoria):
fuente
Acabo de encontrar esto integrado en Oracle 10g si eso es lo que estás usando. Tuve que quitar todos los caracteres especiales para comparar un número de teléfono.
fuente