Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-04-2006
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 20
fidel Va por buen camino
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.

Última edición por fidel fecha: 23-04-2006 a las 01:13:03.
Responder Con Cita
  #2  
Antiguo 23-04-2006
Chaja Chaja is offline
No confirmado
 
Registrado: ago 2004
Ubicación: Mar del Plata
Posts: 238
Poder: 0
Chaja Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 23-04-2006
opardor opardor is offline
Miembro
 
Registrado: jul 2005
Posts: 16
Poder: 0
opardor Va por buen camino
Hola, también podrias hacer algo la siguiente consulta SQL:

Código SQL [-]
select * from socios where apellidos between 'A%' and 'D%';
Responder Con Cita
  #4  
Antiguo 24-04-2006
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 20
fidel Va por buen camino
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.

Última edición por fidel fecha: 24-04-2006 a las 11:46:43.
Responder Con Cita
  #5  
Antiguo 24-04-2006
opardor opardor is offline
Miembro
 
Registrado: jul 2005
Posts: 16
Poder: 0
opardor Va por buen camino
Wink

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

Última edición por opardor fecha: 24-04-2006 a las 18:09:05. Razón: Me equivoqué al poner las etiquetas
Responder Con Cita
  #6  
Antiguo 24-04-2006
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 20
fidel Va por buen camino
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.
Responder Con Cita
  #7  
Antiguo 25-04-2006
jam jam is offline
Miembro
 
Registrado: may 2003
Posts: 74
Poder: 21
jam Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 25-04-2006
opardor opardor is offline
Miembro
 
Registrado: jul 2005
Posts: 16
Poder: 0
opardor Va por buen camino
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.
Responder Con Cita
  #9  
Antiguo 27-04-2006
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 20
fidel Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Creador de la Web dice que los Weblogs se acercan a su idea inicial de internet Sasuke_Cub Noticias 1 27-09-2005 10:15:43
Duda con el ámbito de variables cardomjar Varios 6 16-03-2005 12:45:52
Unir dos campos (nombre + apellidos) Tomás Impresión 8 09-02-2004 16:56:32
Cuestión de ámbito jmdd OOP 2 08-02-2004 05:53:12


La franja horaria es GMT +2. Ahora son las 21:41:59.


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
Copyright 1996-2007 Club Delphi