Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Seleccionar ambito de apellidos por inicial (https://www.clubdelphi.com/foros/showthread.php?t=30890)

fidel 22-04-2006 19:47:04

Seleccionar ambito de apellidos por inicial
 
Hola:

Repito un hilo que tenía ayer y que ha desaparecido ???

FireBird conectado con IBXs.

Por ejemplo, el usuario escoge en dos ComboBox listar apellidos desde los que empiezan por A hasta los que empiezan por D.

La consulta que tengo y no me selecciona los de la D (en el ejemplo) es esta
Código SQL [-]
DM.IBDSSocios.SelectSQL.Text := 'select * from SOCIOS where APELLIDOS Between  :LDESDE and :LHASTA';
DM.IBDSSocios.ParamByName('LDESDE').AsString := CBLetraDesde.Text;
DM.IBDSSocios.ParamByName('LHASTA').AsString := CBLetraHasta.Text;

Lo que quiero hacer es en vez de comparar todo el apellido, comparar solo la inicial del apellido

Algo asi en seudocódigo:

'select ..... where Inicialde(APELLIDOS) Between .......'

¿Cómo se escribiría esto en SQL?

Gracias.

Un saludo.

Chaja 23-04-2006 03:38:05

Consulta
 
Master :
usa la sentencia CONTAING en el where lo que hace es buscar que el contenido de la palabar se encuentre en el dato a buscar ej:

select * from clientes where nombre containg "pe"

y va a traer todos los registros que tengan pe en su nombre

chau

Luis Roldan
Mar del Plata
Argentina

opardor 23-04-2006 04:08:03

Hola, también podrias hacer algo la siguiente consulta SQL:

Código SQL [-]
select * from socios where apellidos between 'A%' and 'D%';

fidel 24-04-2006 11:44:30

Hola:

Aclaro que es una tabla FireBird 1.5

CONTAING me da errror, y además creo que no serviría

select * from socios where apellidos between 'A%' and 'D%';

El problema que parece que hay es que no funciona el comodín %
Con Like si que funciona el comodín, pero no se como se puede hacer

Esto va correcto
Código SQL [-]
DM.IBDSSocios.SelectSQL.Text := 'select * from SOCIOS where UPPER(APELLIDOS) Between :LDESDE and :LHASTA';
DM.IBDSSocios.ParamByName('LDESDE').AsString := AnsiUpperCase('A');
DM.IBDSSocios.ParamByName('LHASTA').AsString := AnsiUpperCase('Gil Olmos');

Abad Antúnez
....
Gil Olmos

Esto con comodín % no funciona
Código SQL [-]
DM.IBDSSocios.SelectSQL.Text := 'select * from SOCIOS where UPPER(APELLIDOS) Between :LDESDE and :LHASTA';
DM.IBDSSocios.ParamByName('LDESDE').AsString := AnsiUpperCase('A');
DM.IBDSSocios.ParamByName('LHASTA').AsString := AnsiUpperCase('G') + '%';

Abad Antúnez
....
Fuentes Hiniesta

¿Alguna idea?, gracias.

Un saludo.

opardor 24-04-2006 18:05:31

Cita:

Código SQL [-]
select * from socios where apellidos between 'A%' and 'D%';

Tienes razón. El comodín no funciona. Además, me devuelve valores hasta antes de los que empiecen por la letra D. Probé la sentencia anterior sin comodines y obtuve el mismo resultado.

Ahora hice esta otra prueba y obtuve el resultado esperado.

Código SQL [-]
SELECT * 
FROM socios 
WHERE apellidos>=(SELECT MIN(apellidos) FROM socios WHERE apellidos LIKE 'A%')
  AND apellidos<=(SELECT MAX(apellidos) FROM socios WHERE apellidos LIKE 'F%');

Todas mis pruebas las he hecho con oracle 9.2 ;)

fidel 24-04-2006 23:18:31

Hola:

Muchas gracias opardor.

He hecho la prueba con esto que me indicas
Código SQL [-]
with DM.IBDSSocios do
  begin
    SelectSQL.Clear;
    SelectSQL.Add( 'SELECT * FROM socios ' );
    SelectSQL.Add( 'WHERE apellidos>=(SELECT MIN(apellidos) FROM socios WHERE apellidos LIKE :LDESDE)' );
    SelectSQL.Add( 'AND apellidos<=(SELECT MAX(apellidos) FROM socios WHERE apellidos LIKE :LHASTA)' );
    ParamByName('LDESDE').AsString := CBLetraDesde.Text + '%';
    ParamByName('LHASTA').AsString := CBLetraHasta.Text + '%';
  end;

Funciona siempre y cuando haya apellidos con todas las iniciales y la primera o la última de la serie pedida no esté acentuada.

Si por el contrario, escojo por ejemplo listar de la A a la Q y no hay apellidos que empiecen por Q no funciona, la consulta queda vacía.

Tampoco funciona si por ejemplo pido de la A a la D y el primer apellido es con A acentúada, por ejemplo Álvarez.

¿Alguna otra forma de hacerlo funcionar'. Gracias.

Un saludo.

jam 25-04-2006 15:34:33

prueba con :
select * from socios where apellidos>=:Ldesde and apellidos <:Lhasta||'ZZZZ'

la expresión Lhasta||'ZZZZ' es para que seleccione los apellidos de esa letra. Si pones solo :Lhasta los que empiecen por es letra no aparecen.

opardor 25-04-2006 18:01:54

Cita:

Funciona siempre y cuando haya apellidos con todas las iniciales y la primera o la última de la serie pedida no esté acentuada.

Si por el contrario, escojo por ejemplo listar de la A a la Q y no hay apellidos que empiecen por Q no funciona, la consulta queda vacía.

Tampoco funciona si por ejemplo pido de la A a la D y el primer apellido es con A acentúada, por ejemplo Álvarez.
Bueno supongo que los carácteres especiales deberás agregarlos manualmente.
Ahora si no existe una inicial por ejemplo la "Q" lo único que tendrías que hacer es agregarla. Estudia la función nvl, aunque no sé si FireBird cuenta con ella.

http://www.lc.leidenuniv.nl/awcourse...a96540/toc.htm

Tal vez encuentres alguna otra función que se acople más a tus necesidades.

fidel 27-04-2006 09:13:32

Hola:

Con ||Z como comodín funciona perfectamente.
Código SQL [-]
IBDSSocios.SelectSQL.Text := 'select * from SOCIOS where UPPER(APELLIDOS) Between :LDESDE and :LHASTA'
IBDSSocios.ParamByName('LDESDE').AsString := CBLetraDesde.Text ;
IBDSSocios.ParamByName('LHASTA').AsString := CBLetraHasta.Text + '||Z';
Tengo en los combos, puestas en mayúscula, las 29 letras del abecedario español y en varias pruebas que he hecho funciona bien esté o no acentuada la letra inicial, con la ñ, discrimina bien las letras “c “ “ch “, “l “ “ll “ (base de datos y campos Caracter Set ISO8859_1 COLLATE ES_ES)

Muchísimas gracias a todos.

Un saludo.


La franja horaria es GMT +2. Ahora son las 00:20:05.

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