Este foro usa cookies
Este foro utiliza cookies para almacenar su información de inicio de sesión si está registrado y su última visita si no lo está. Las cookies son pequeños documentos de texto almacenados en su computadora; las cookies establecidas por este foro solo se pueden usar en este sitio web y no representan ningún riesgo de seguridad. Las cookies en este foro también rastrean los temas específicos que ha leído y la última vez que los leyó. Si Ud. continúa navegando, entenderemos que acepta todas las cookies.

Se almacenará una cookie en su navegador, independientemente de la elección, para evitar que se le vuelva a hacer esta pregunta. Podrá cambiar la configuración de sus cookies en cualquier momento utilizando el enlace en el pie de página.

El foro antiguo se encuentra accesible desde https://foro.gambas-es.org en modo de solo lectura.

Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5

Extendiendo la clase String - SQLike
#1
Bug 

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:
SQL
  1. 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.
GAMBAS
  1. '' Converts the word into an expression that allows filtering with accents in a like statement.
  2. '' The supported languages are: Spanish, Portuguese, Italian, French, German and Czech.
  3.  
  4.  
  5.   Dim sSymbol As String
  6.   Dim aOut As New String[]
  7.   Dim sOut As String
  8.  
  9.   aOut.Clear
  10.  
  11.   For i = 1 To String.Len(sInput)
  12.     sSymbol = String.Mid(sInput, i, 1)
  13.     Select String.LCase(sSymbol)
  14.       Case "a", "á", "à", "â", "ã", "ä", "æ"
  15.         aOut.Add("[aáàâãäæ]")
  16.  
  17.       Case "e", "é", "è", "ê", "ë", "ě"
  18.         aOut.Add("[eéèêëě]")
  19.  
  20.       Case "i", "í", "ì", "ï", "î"
  21.         aOut.Add("[iíìïî]")
  22.  
  23.       Case "o", "ó", "ò" "ô", "õ", "ö", "œ"
  24.         aOut.Add("[oóòôõöœ]")
  25.  
  26.       Case "u", "ú", "ù", "û", "ü", "ů"
  27.         aOut.Add("[uúùûüů]")
  28.  
  29.       Case "c", "ç", "č"
  30.         aOut.Add("[cçč]")
  31.  
  32.       Case "n", "ñ", "ň"
  33.         aOut.Add("[nñň]")
  34.  
  35.       Case "y", "ý", "ÿ"
  36.         aOut.Add("[yýÿ]")
  37.  
  38.       Case "b", "ß"
  39.         aOut.Add("[bß]")
  40.  
  41.       Case "z", "ž"
  42.         aOut.Add("[zž]")
  43.  
  44.       Case "d", "ď"
  45.         aOut.Add("[dď]")
  46.  
  47.       Case "r", "ř"
  48.         aOut.Add("[rř]")
  49.  
  50.       Case "s", "š"
  51.         aOut.Add("[sš]")
  52.  
  53.       Case "t", "ť"
  54.         aOut.Add("[tť]")
  55.  
  56.       Case Else
  57.         aOut.Add(sSymbol)
  58.  
  59.     End Select
  60.   Next
  61.   sOut = aOut.Join("")
  62.   Return sOut
  63.  




Archivos adjuntos
.gz sample-string-sqlike-0.0.1.tar.gz Tamaño: 12.42 KB  Descargas: 1

1 Saludo.
[-] Los siguientes 2 usuarios dicen gracias a tincho por este post:
  • gambafeliz, guizans
    ¡Gracias!
#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.

En un lugar de La Mancha de cuyo nombre me acuerdo perfectamente...
    ¡Gracias!
#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.
    ¡Gracias!
#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.
    ¡Gracias!
#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...
    ¡Gracias!
#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.

1 Saludo.
    ¡Gracias!
#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.
    ¡Gracias!


Posibles temas similares…
Tema / Autor Respuestas Vistas Último mensaje

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)