Estate atento porque en esta crónica vas a hallar la solución que buscas.
Solución:
Puedes usar DB2 TRANSLATE()
Función para aislar caracteres no alfanuméricos. Tenga en cuenta que esto no funcionará en el modo de compatibilidad de Oracle, porque en ese caso DB2 tratará las cadenas vacías como NULL, como lo haría Oracle.
SELECT *
FROM yourtable
WHERE LENGTH(TRANSLATE(
yourcolumn,
'', -- empty string
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
)) > 0 -- after translating ASCII characters to empty strings
-- there's still something left
Sé que este es un hilo más antiguo… pero después de leer una tonelada… este era exactamente mi problema y aquí está la solución que se me ocurrió para determinar las filas problemáticas… para poder entrar y arreglarlas manualmente. . FYI: el problema para mí ocurre porque los usuarios copian / pegan desde Word en mi aplicación. Sí, sé que deberíamos arreglar eso antes de guardar… pero tenemos peces más grandes que freír.
SELECT * FROM TABLE_A
where ASCII(TRIM(TRANSLATE(
COLUMN_A,
' ', -- empty string
'()<>!;%$#*[email protected]+&^=-":/''.,0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
))) not in (10,64)
Algunas notas:
- Usamos iSeries DB2 y esto funciona muy bien
- Asegúrese de mantener todos los espacios intactos en la función de traducción… necesita 1 espacio para cada carácter que use
- En el tercer parámetro de la función de traducción hay 2 comillas simples una al lado de la otra y la primera simplemente escapa de la otra (para aquellos que no lo sepan)
Puede utilizar una expresión regular para recuperar los caracteres no válidos. Sin embargo, este proceso es muy costoso porque tiene que leer todos los datos y luego procesarlos.
Para utilizar expresiones regulares en DB2, debe adaptar el entorno, ya que esta funcionalidad no está disponible para SQL en la instalación. Tienes estas tres opciones:
- Use expresiones regulares con xQuery en lugar de SQL normal. http://publib.boulder.ibm.com/infocenter/db2luw/v10r1/topic/com.ibm.db2.luw.xml.doc/doc/xqrregexp.html
- Defina procedimientos almacenados en C externos como se describe en este artículo: http://www.ibm.com/developerworks/data/library/techarticle/0301stolze/0301stolze.html
- Si entiende japonés, aquí tiene un buen artículo que explica cómo usar RegEx en xQuery https://www.ibm.com/developerworks/jp/data/library/db2/j_d-regularexpression/ Solo puede descargar las fuentes e instalar a ellos. Con los pocos ejemplos en caracteres latinos, creo que podrías entender cómo usar esto.
Una vez que haya definido una expresión regular para ignorar los caracteres válidos (algo así como /[^a-zA-Z0-9]/
), entonces podría ejecutarse en la base de datos. Recuerde recuperar otra columna donde pueda detectar la fila (por ejemplo, una ID de columna) y luego realice actualizaciones o elimine para eliminar los caracteres no válidos.
Si no sabes cómo usar expresiones regulares, aquí tienes una buena fuente de información: http://www.regular-expressions.info/ Especialmente http://www.regular-expressions.info/charclass.html
Hay una pregunta relacionada con la expresión regular: Expresiones regulares en DB2 SQL
Si te mola la idea, tienes la opción de dejar un post acerca de qué te ha gustado de este tutorial.