Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-09-2014
Efren2006 Efren2006 is offline
Miembro
 
Registrado: feb 2006
Posts: 172
Poder: 19
Efren2006 Va por buen camino
Buscar Valor dentro de una Cadena

Saludos


Me gustaría saber si existe alguna función de Firebir que me permita buscar un valor dentro de una cadena de caracteres es decir lo mismo que hace la Función POS de Delphi.

Nota: es para usarla dentro de un Procedimiento Almacenado no para buscar datos ya que probé con la Función "Position" y no compila

Uso Firebid 2.1
Responder Con Cita
  #2  
Antiguo 10-09-2014
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Si solo necesitas saber si contiene la cadena, puedes probar con LIKE
Código SQL [-]
cadena = 'ESTO ES UNA PRUEBA DE CADENAS';
resultado_contiene = '';
resultado_empieza = '';
resultado_termina =  '';

if (cadena like '%PRUEBA%') then
   resultado_contiene = 'CONTIENE PRUEBA';
else
   resultado_contiene = 'NO CONTIENE PRUEBA';

if (cadena like 'PRUEBA%') then
   resultado_empieza = 'EMPIEZA CON LA PALABRA PRUEBA';
else
   resultado_empieza = 'NO EMPIEZA CON LA PALABRA PRUEBA';

if (cadena like '%PRUEBA') then
   resultado_termina = 'TERMINA CON LA PALABRA PRUEBA';
else
   resultado_termina = 'NO TERMINA CON LA PALABRA PRUEBA';

Código SQL [-]
/* Busca todos los clientes que contengan GOMEZ en el nombre sin tener en cuenta mayúsculas o minúsculas */
select * from clientes
where upper(nombre) like '%GOMEZ%'

Última edición por duilioisola fecha: 10-09-2014 a las 19:41:16.
Responder Con Cita
  #3  
Antiguo 10-09-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
También con containing que encuentra ya esté en mayúsculas o minúsculas, al principio, enmedio o al final, sin tener que especificar nada.
Responder Con Cita
  #4  
Antiguo 11-09-2014
Efren2006 Efren2006 is offline
Miembro
 
Registrado: feb 2006
Posts: 172
Poder: 19
Efren2006 Va por buen camino
Gracias por sus aportes

Amigo duilioisola probare esta opción ya que es la que se parece mas a lo que necesito...

Amigo Casimiro Notevi la instruccion containing funciona con clausalas SELECT ... yo la necesito para comprar 2 variables dentro de un Procedimiento almacenado

Avisare los resultados
Responder Con Cita
  #5  
Antiguo 11-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Efren2006
Cita:
Empezado por Efren2006 Ver Mensaje
Amigo Casimiro Notevi la instruccion containing funciona con clausalas SELECT ... yo la necesito para comprar 2 variables dentro de un Procedimiento almacenado
Pues a mi me funciona muy bien sin usar SELECT...
Código SQL [-]
SET TERM ^;

CREATE OR ALTER PROCEDURE PR_CONTAINING(
  SUBSTR VARCHAR(255), STR VARCHAR(255))
RETURNS (
  RESULT SMALLINT)
AS
BEGIN
  IF (STR CONTAINING(SUBSTR)) THEN
    RESULT = 1;
  ELSE
    RESULT = 0;
  SUSPEND;
END^

SET TERM ;^

De todos modos Firebird 2.1 ya cuenta con la función POSITION() que creo hace lo que buscas.
Código SQL [-]
SELECT POSITION('PERRO' in 'EL VIEJO PERRO DE JUAN') FROM RDB$DATABASE

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #6  
Antiguo 11-09-2014
Efren2006 Efren2006 is offline
Miembro
 
Registrado: feb 2006
Posts: 172
Poder: 19
Efren2006 Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola Efren2006


Pues a mi me funciona muy bien sin usar SELECT...
Código SQL [-]
SET TERM ^;

CREATE OR ALTER PROCEDURE PR_CONTAINING(
  SUBSTR VARCHAR(255), STR VARCHAR(255))
RETURNS (
  RESULT SMALLINT)
AS
BEGIN
  IF (STR CONTAINING(SUBSTR)) THEN
    RESULT = 1;
  ELSE
    RESULT = 0;
  SUSPEND;
END^

SET TERM ;^

De todos modos Firebird 2.1 ya cuenta con la función POSITION() que creo hace lo que buscas.
Código SQL [-]
SELECT POSITION('PERRO' in 'EL VIEJO PERRO DE JUAN') FROM RDB$DATABASE

Saludos
Amigo ecfisa Tienes razon fue un error mio en la implementación de la función CONTAINING

Perdona Casimiro Notevi tu aporte fue el acertado..

Gracias a ambos por el aporte esto era exactamente lo que necesitaba
Responder Con Cita
  #7  
Antiguo 11-09-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Efren2006 Ver Mensaje
Amigo ecfisa Tienes razon fue un error mio en la implementación de la función CONTAINING
Perdona Casimiro Notevi tu aporte fue el acertado..
Gracias a ambos por el aporte esto era exactamente lo que necesitaba
El aporte de [duilioisola] también es acertado, aunque use otra función.
Responder Con Cita
  #8  
Antiguo 11-09-2014
Efren2006 Efren2006 is offline
Miembro
 
Registrado: feb 2006
Posts: 172
Poder: 19
Efren2006 Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje

De todos modos Firebird 2.1 ya cuenta con la función POSITION() que creo hace lo que buscas.
Código SQL [-]
SELECT POSITION('PERRO' in 'EL VIEJO PERRO DE JUAN') FROM RDB$DATABASE

Saludos
Se me olvidaba comentar la Función POSITION NO funciona dentro de los Procedimientos Almacenados.... Pero SI en consultas
Responder Con Cita
  #9  
Antiguo 12-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Efren2006.
Cita:
Empezado por Efren2006 Ver Mensaje
Se me olvidaba comentar la Función POSITION NO funciona dentro de los Procedimientos Almacenados.... Pero SI en consultas
Lamento tener que disentir nuevamente...

Realizá esta simple prueba:
Código SQL [-]
SET TERM ^;

CREATE OR ALTER PROCEDURE PR_POSITION(
  SUBSTR VARCHAR(255), STR VARCHAR(255))
RETURNS (
  RESULT SMALLINT)
AS
BEGIN
  RESULT = POSITION(SUBSTR, STR);
  SUSPEND;
END^

SET TERM ;^
Y podrás usar PR_POSITION del mismo modo que POSITION, por ejemplo:
Código SQL [-]
SET TERM ^;

CREATE OR ALTER PROCEDURE PR_TEST_PR_POSITION(
  SUBSTR VARCHAR(255), STR VARCHAR(255))
RETURNS (
  RESULT SMALLINT)
AS
BEGIN
  EXECUTE PROCEDURE PR_POSITION(SUBSTR, STR) RETURNING_VALUES(RESULT);
  SUSPEND;
END^

SET TERM ;^

Y si sos de los que te gusta ir a las bases, nada te impide hacer tu propia función POS:
Código SQL [-]
SET TERM ^ ;

CREATE OR ALTER PROCEDURE POS (
    SUBSTR VARCHAR(255),
    STR VARCHAR(255))
RETURNS (
    RESULT INTEGER)
AS
  DECLARE VARIABLE I INTEGER;
  DECLARE VARIABLE J INTEGER;
BEGIN
  I = 1;
  J = 1;
  STR = STR || ' ';
  WHILE (I <= CHAR_LENGTH(SUBSTR) AND J <= CHAR_LENGTH(STR)) DO
  BEGIN
    IF (SUBSTRING(SUBSTR FROM I FOR 1) = SUBSTRING(STR FROM J FOR 1)) THEN
      I = I + 1;
    ELSE
      I = 1;
    J = J + 1;
  END
  IF (J <= CHAR_LENGTH(STR)) THEN
    RESULT = J - I + 1;
  ELSE
    RESULT = 0;
  SUSPEND;
END^

SET TERM ; ^

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #10  
Antiguo 12-09-2014
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Responder Con Cita
  #11  
Antiguo 13-09-2014
Efren2006 Efren2006 is offline
Miembro
 
Registrado: feb 2006
Posts: 172
Poder: 19
Efren2006 Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola Efren2006.

Lamento tener que disentir nuevamente...

Realizá esta simple prueba:
Código SQL [-]
SET TERM ^;

CREATE OR ALTER PROCEDURE PR_POSITION(
  SUBSTR VARCHAR(255), STR VARCHAR(255))
RETURNS (
  RESULT SMALLINT)
AS
BEGIN
  RESULT = POSITION(SUBSTR, STR);
  SUSPEND;
END^

SET TERM ;^
Y podrás usar PR_POSITION del mismo modo que POSITION, por ejemplo:
Código SQL [-]
SET TERM ^;

CREATE OR ALTER PROCEDURE PR_TEST_PR_POSITION(
  SUBSTR VARCHAR(255), STR VARCHAR(255))
RETURNS (
  RESULT SMALLINT)
AS
BEGIN
  EXECUTE PROCEDURE PR_POSITION(SUBSTR, STR) RETURNING_VALUES(RESULT);
  SUSPEND;
END^

SET TERM ;^

Amigo ecfisa tal vez el problema lo tengo yo pero copie y pegue dicho procedimiento y al compilar me da el siguiente error:
Cita:
Error del precompilador: parsing error - POSITION.
Uso Firebird 2.1

Última edición por Efren2006 fecha: 14-09-2014 a las 00:07:01.
Responder Con Cita
  #12  
Antiguo 14-09-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola efren2006.

Seguramente el error es generado por el componente o por el gestor de base de datos que estas usando para conectarte a Firebird, como lo mencionan en The Firebird FAQ: Parsing error.

Desde Flamerobin o IBExpert funciona correctamente tál como está en el mensaje anterior y desde Delphi con los componentes IBX tambien lo hace bién:
Código Delphi [-]
...
begin
  IBStoredProc1.Params.Clear;
  IBStoredProc1.StoredProcName:= 'PR_POSITION';
  IBStoredProc1.ParamByName('SUBSTR').AsString:= 'UN';
  IBStoredProc1.ParamByName('STR').AsString:= 'HOLA MUNDO';
  IBStoredProc1.ExecProc;
  ShowMessage(IBStoredProc1.ParamByName('RESULT').AsString);  // muestra 7
end;

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #13  
Antiguo 14-09-2014
Efren2006 Efren2006 is offline
Miembro
 
Registrado: feb 2006
Posts: 172
Poder: 19
Efren2006 Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola efren2006.

Seguramente el error es generado por el componente o por el gestor de base de datos que estas usando para conectarte a Firebird, como lo mencionan en The Firebird FAQ: Parsing error.

Desde Flamerobin o IBExpert funciona correctamente tál como está en el mensaje anterior y desde Delphi con los componentes IBX tambien lo hace bién:
Código Delphi [-]
...
begin
  IBStoredProc1.Params.Clear;
  IBStoredProc1.StoredProcName:= 'PR_POSITION';
  IBStoredProc1.ParamByName('SUBSTR').AsString:= 'UN';
  IBStoredProc1.ParamByName('STR').AsString:= 'HOLA MUNDO';
  IBStoredProc1.ExecProc;
  ShowMessage(IBStoredProc1.ParamByName('RESULT').AsString);  // muestra 7
end;

Saludos
Yo uso IB Manager 3 para gestionar mi base de Datos,,, Efectivamente según lo que lei en el link que mencionas es asi.... ya estare atento para la proxima vez que me de este tipo de errores

Saludos

Última edición por Efren2006 fecha: 14-09-2014 a las 03:06:45.
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
buscar una palabra dentro de una cadena Patricio Varios 2 31-12-2010 10:48:33
Funcion para buscar cadena dentro de otra cadena y el numero de veces flystar Varios 3 02-07-2007 22:48:08
Buscar un palabra dentro de una cadena eyscom Varios 6 29-07-2006 00:05:05
buscar dentro de una cadena con repetición jzginez Varios 4 12-05-2006 21:40:18
Buscar cadena dentro de otra cadena doverzhoff Varios 4 27-01-2004 05:27:15


La franja horaria es GMT +2. Ahora son las 01:46:03.


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