Elimine caracteres no numéricos en SELECT

En un informe de proyecto de MS Access 2007, tengo la siguiente consulta (networkingactada):

SELECT SomeCol FROM SomeTable 

El problema es que aparentemente SomeCol contiene algunos caracteres invisibles. Por ejemplo, veo un resultado devuelto como 123456 pero SELECT LEN(SomeCol) devuelve 7 . Cuando copio el resultado a Notepad ++, se muestra como ?123456 .

La columna está configurada en TEXT . No tengo control sobre este tipo de datos, así que no puedo cambiarlo.

¿Cómo puedo modificar mi consulta SELECT para quitar todo lo que no sea numérico? Sospecho que RegEx es el path a seguir … alternativamente, ¿hay una function CAST o CONVERT ?

Usted mencionó usar una expresión regular para esto. Es cierto que Access 'db engine no admite expresiones regulares directamente. Sin embargo, parece que está dispuesto a usar una function definida por el usuario de VBA en su consulta … y una UDF puede usar un enfoque de expresión regular. Ese enfoque debe ser simple, fácil y de performance más rápido que iterar a través de cada carácter de la cadena de input y almacenar solo los caracteres que desee conservar en una nueva cadena de salida.

 Public Function OnlyDigits(ByVal pInput As String) As String Static objRegExp As Object If objRegExp Is Nothing Then Set objRegExp = CreateObject("VBScript.RegExp") With objRegExp .Global = True .Pattern = "[^\d]" End With End If OnlyDigits = objRegExp.Replace(pInput, vbNullString) End Function 

Aquí hay un ejemplo de esa function en la window Inmediato con caracteres "x" como proxies para tus personajes invisibles. ( Todos los caracteres no incluidos en la class de caracteres "dígitos" serán descartados.)

 ? OnlyDigits("x1x23x") 123 

Si ese es el resultado que desea, simplemente use la function en su consulta.

 SELECT OnlyDigits(SomeCol) FROM SomeTable; 

No hay RegEx en Access, al less no en SQL. Si se aventura a VBA, también podría usar una function StripNonNumeric VBA personalizada en la statement SQL.

por ejemplo, SELECT StripNonNumeric(SomeCol) as SomeCol from SomeTable

 Function StripNonNumeric(str) keep = "0123456789" outstr = "" For i = 1 to len(str) strChar = mid(str,i,1) If instr(keep,strChar) Then outstr = outstr & strChar End If Next StripNonNumeric = outstr End Function 

Puedes hacerlo todo en una consulta, combinando esta pregunta con tu pregunta anterior , obtienes:

 SELECT IIf(IsNumeric([atext]), IIf(Len([atext])<4,Format([atext],"000"), Replace(Format(Val([atext]),"#,###"),",",".")), IIf(Len(Mid([atext],2))<4,Format(Mid([atext],2),"000"), Replace(Format(Val(Mid([atext],2)),"#,###"),",","."))) AS FmtNumber FROM Table AS t; 
 Public Function fExtractNumeric(strInput) As String ' Returns the numeric characters within a string in ' sequence in which they are found within the string Dim strResult As String, strCh As String Dim intI As Integer If Not IsNull(strInput) Then For intI = 1 To Len(strInput) strCh = Mid(strInput, intI, 1) Select Case strCh Case "0" To "9" strResult = strResult & strCh Case Else End Select Next intI End If fExtractNumeric = strResult 

Función final