tincho   03-04-2022, 22:40
#1
Hola a todos.
[Imagen: 2ipbxXu.png]
Como algunos de ustedes sabrán, hay motores de bases de datos que soportan las expresiones regulares (REGEXP) en las sentencias SQL.
Esto es muy útil si se desea filtrar registros cuando las capacidad de LIKE se ve superada.
Si por ejemplo se buscan registros que en un determinado campo tengan los "A" o también "Á" con LIKE no se puede hacer pero con REGEXP si.
Ejemplo:
Código:
SELECT * FROM UnaTabla WHERE UnCampo REGEXP '[AÁ]'
El inconveniente sucede cuando escribimos un texto en una casilla de búsqueda de nuestro programa y queremos que al escribir "A" o "a" aparezcan listados todos los registros que en un campo tal tengan "A", "Á", "a" y "á", en este caso entra esta función llamada  SQLike que les comparto aquí, que en base a una cadena de texto que se pasa como parámetro esta devuelve otra pero con todas las posibilidades de las letras con tilde.
Código:
'' Converts the word into an expression that allows filtering with accents in a like statement.
'' The supported languages are: Spanish, Portuguese, Italian, French, German and Czech.

Static Public Function SQLike(sInput As String) As String

  Dim i As Integer
  Dim sSymbol As String
  Dim aOut As New String[]
  Dim sOut As String

  aOut.Clear

  For i = 1 To String.Len(sInput)
    sSymbol = String.Mid(sInput, i, 1)
    Select String.LCase(sSymbol)
      Case "a", "á", "à", "â", "ã", "ä", "æ"
        aOut.Add("[aáàâãäæ]")

      Case "e", "é", "è", "ê", "ë", "ě"
        aOut.Add("[eéèêëě]")

      Case "i", "í", "ì", "ï", "î"
        aOut.Add("[iíìïî]")

      Case "o", "ó", "ò" "ô", "õ", "ö", "œ"
        aOut.Add("[oóòôõöœ]")

      Case "u", "ú", "ù", "û", "ü", "ů"
        aOut.Add("[uúùûüů]")

      Case "c", "ç", "č"
        aOut.Add("[cçč]")

      Case "n", "ñ", "ň"
        aOut.Add("[nñň]")

      Case "y", "ý", "ÿ"
        aOut.Add("[yýÿ]")

      Case "b", "ß"
        aOut.Add("[bß]")

      Case "z", "ž"
        aOut.Add("[zž]")

      Case "d", "ď"
        aOut.Add("[dď]")

      Case "r", "ř"
        aOut.Add("[rř]")

      Case "s", "š"
        aOut.Add("[sš]")

      Case "t", "ť"
        aOut.Add("[tť]")

      Case Else
        aOut.Add(sSymbol)

    End Select
  Next
  sOut = aOut.Join("")
  Return sOut

End
Archivos adjuntos
.gz
sample-string-sqlike-0.0.1.tar.gz (Tamaño: 12.42 KB Descargas: 1)
Última modificación: 03-04-2022, 22:44 por tincho.

1 Saludo.
Grandamakulo   04-04-2022, 08:27
#2
Lo mismo digo una burrada, pero ¿por qué no transformas primero las cadenas y luego las comparas? ¿O llevaría demasiado tiempo?
Quiero decir, si puedes emplear RegEx, podrías usar expresiones como cualquiera de estas tres, según lo que busques hacer:
Código:
([A-Za-z0-9\u00C0-\u02B8\-])[A-Za-z0-9\u00C0-\u02B8\-]
[A-Za-z0-9\u00C0-\u02B8]
[A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9])[A-Za-zÁÉÍÓÚáéíóúÜüñÑ0-9]
Para hacer una preselección y después una nueva consulta sobre el resultado.
No sé si me he explicado, pero, en resumen, es como cuando haces Ucase(RTrim(LTrim(A$))) previo a una consulta, pero en este caso sustituyendo las tildadas con RegExp.Replace.
Última modificación: 04-04-2022, 08:27 por Grandamakulo.

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
tincho   04-04-2022, 10:07
#3
(04-04-2022, 08:27)Grandamakulo escribió: Lo mismo digo una burrada, pero ¿por qué no transformas primero las cadenas y luego las comparas? ¿O llevaría demasiado tiempo?

No lo se, habría que probarlo. ¿Como harías la consulta SQL? si es posible proporciona un ejemplo o modifica el código que adjunte.

1 Saludo.
gambafeliz   04-04-2022, 21:15
#4
Hola, Grandamakulo

Seria interesante que expliques tu opinión con mas detalle, yo en lo particular no soy muy ducho con las expresiones irregulares. Gracias.

tincho, Interesante propuesta, lo estudio para ver si le puedo sacar partido. Gracias.

De momento, no conocía, REGEXP con lo cual, hoy he aprendido algo nuevo.
Última modificación: 04-04-2022, 21:18 por gambafeliz.
Grandamakulo   05-04-2022, 08:16
#5
Estoy fuera, si me permitís un día o dos, trato de mostrar lo que quiero decir.  Big Grin Big Grin Big Grin Big Grin Big Grin

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
tincho   05-04-2022, 20:07
#6
(05-04-2022, 08:16)Grandamakulo escribió: Estoy fuera, si me permitís un día o dos, trato de mostrar lo que quiero decir.

Tranquilo, este tema que propongo es solo un ejemplo de una función que extiende la clase String, lo de las consultas SQL es secundario, por lo menos en este tema.
Última modificación: 05-04-2022, 20:10 por tincho.

1 Saludo.
gambafeliz   11-05-2022, 17:29
#7
tincho fue interesante tu propuesta pero añado tu función y pongo tu consulta y da error en la base de datos, ¿es posible que tengas algo distinto?

Me devuelve la base de datos:
Cannot execute query on undefined or invalid database.

Es exactamente con todo tu código de ejemplo.


Si funciona, no me he dado cuenta de un problema de mi código. Aunque debo decir que no funciona para obtener el resultado que esperabamos, osea resultados con acentos.
Última modificación: 11-05-2022, 17:39 por gambafeliz.
  
Usuarios navegando en este tema: 4 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.