Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Consulta con LIKE es case sensitive? (https://www.clubdelphi.com/foros/showthread.php?t=57470)

Faust 16-06-2008 19:01:32

Consulta con LIKE es case sensitive?
 
Saludos, estoy usando una consulta con un LIKE en Interbase mediante un TQuery, pero lo que pongo en mi LIKE debe de ser en mayúsculas y minúsculas tal y como está en la base de datos, es decir si pongo:

Código SQL [-]
SELECT *
FROM CLIENTES
WHERE NOMBRE LIKE 's%'
ORDER BY NOMBRE ASC;

Solo me muestra los clientes cuyo nombre empieza con s minuscula.

Hay alguna forma para que este tipo de búsqueda no sea case sensitive?

D-MO 16-06-2008 19:38:33

Cita:

Empezado por Faust (Mensaje 293909)
Hay alguna forma para que este tipo de búsqueda no sea case sensitive?

Si usas MySQL quizá pueda servirte la función UPPER(), si usas otra bd mira que funciones hacen lo mismo.

Saludos.

santiago14 16-06-2008 21:53:17

Like
 
Cita:

Empezado por Faust (Mensaje 293909)
Saludos, estoy usando una consulta con un LIKE en Interbase mediante un TQuery, pero lo que pongo en mi LIKE debe de ser en mayúsculas y minúsculas tal y como está en la base de datos, es decir si pongo:

Código SQL [-]
SELECT *
FROM CLIENTES
WHERE NOMBRE LIKE 's%'
ORDER BY NOMBRE ASC;

Solo me muestra los clientes cuyo nombre empieza con s minuscula.

Hay alguna forma para que este tipo de búsqueda no sea case sensitive?

No conozco una manera pero si se podría pasar todo a minúsculas o a mayúsculas antes de ponerlos en el LIKE, veamos:

Código SQL [-]
 
Select *
From clientes 
where lower(nombre) LIKE 's%'
order by...

La función lower está en las UDF de interbase pero tiene una recomendación que mejor leerla.

*****************************************
* Lower
* Functional description:
* Returns the input string into lower
* case characters. Note: This function
* will not work with international and
* non-ascii characters.
* Note: This function is NOT limited to
* receiving and returning only 80 characters,
* rather, it can use as long as 32767
* characters which is the limit on an
* INTERBASE character string.
*
*****************************************/

Yo encontré otra, "upper" que creo que funciona mejor y no es de una UDF, eso si, hay que pensar todo en mayúsculas. Y si te fijas en los foros la cosa está bien resuelta.

Saludos.

Caro 17-06-2008 02:18:00

Hola Faust, como te dicen debes usar Lower o Upper, para convertir o todo a mayuscula o todo a minuscula, tanto en el campo como en el parametro que le pases a tu like, así no importara si introducen mayusculas o minusculas o ambos.

Código Delphi [-]
 Query1.SQL.Text := 'SELECT * FROM CLIENTES '+
                     'WHERE UPPER(NOMBRE) LIKE '+UpperCase(parametro)+'%'+
                     'ORDER BY NOMBRE ASC';

Y si quieres trabajar con minuscualas entonces utilizas Lower y LowerCase.

Saluditos

Faust 17-06-2008 13:06:48

Gracias por sus respuetsas amigos...

Como lo que pongo en el LIKE es un texto que el usuario introduce en un TEdit, mejor le seteo la propiedad CharCase a ecUpperCase.

Al González 17-06-2008 14:58:50

¡Hola!

Además de las excelentes respuestas dadas, en InterBase y Firebird cuentas con la palabra reservada Containing que equivale a un Like '%X%' pero insensible al tamaño de las letras. ;)

Saludos.

Al.

roman 17-06-2008 16:53:12

Cita:

Empezado por Al González (Mensaje 294083)
equivale a un Like '%X%' pero insensible al tamaño de las letras. ;)

O sea, que da lo mismo si buscas pepe el toro, pepe el toro o pepe el toro

Pero ya en serio, es curioso esto de FireBird. ¿Funciona con cualquier juego de caracteres? Lo pregunto porque, por ejemplo, en MySQL, cada base/tabla tiene definido un juego de caracteres y un cotejamiento. Y es el cotejamiento el que indica si las comparaciones son sensibles a mayúsculas y minúsculas o no. Y es que el cotejamiento controla cosas como hacer que a una búsqueda le de lo mismo u, U, ú y Ú, y no sé si el containing abarca también estos casos.

// Saludos

Al González 17-06-2008 17:18:20

Muy buena pregunta Román.

En el caso de Firebird, el juego de caracteres y el cotejamiento (u ordenamiento, como prefiero llamarle) pueden ser establecidos a nivel de campo y sí, efectivamente Containing funciona con el ordenamiento que tenga establecido el campo en cuestión. Por lo menos sí me funciona con el ordenamiento ES_ES (español de España, México y otros países).

Saludos.

Al González. :)

roman 17-06-2008 17:29:11

¡Ah ya! Pero entonces sí entra en juego el cotejamiento. Digo, porque pudiera ser que se emplease un cotejamiento para el cual la comparación con containing sí distinguiera entre mayúsculas y minúsculas.

Por cierto, en MySQL tambien se puede especificar a nivel de campo y afecta al operador LIKE.

// Saludos

santiago14 17-06-2008 18:00:33

Like...
 
Cita:

Empezado por Caro (Mensaje 294036)
Código Delphi [-]
 Query1.SQL.Text := 'SELECT * FROM CLIENTES '+
                     'WHERE UPPER(NOMBRE) LIKE '+UpperCase(parametro)+'%'+
                     'ORDER BY NOMBRE ASC';

Y si quieres trabajar con minuscualas entonces utilizas Lower y LowerCase.

Saluditos

Aquí para no tener problemas con las letras acentuadas, la ñ, Ñ y otras yerbas sería mejor usar AnsiUpperCase y AnsiLowerCase en lugar de UpperCase y LowerCase.
La verdad que la funcion Containing no la he usado, hago algunas pruebas y veo que tal.

Saludos.

Faust 17-06-2008 21:47:21

Probaré las diferentes opciones... de seguro alguna me sirve...


La franja horaria es GMT +2. Ahora son las 06:51:27.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi