Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Buscar Valor dentro de una Cadena (https://www.clubdelphi.com/foros/showthread.php?t=86636)

Efren2006 10-09-2014 18:13:11

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

duilioisola 10-09-2014 19:36:32

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%'

Casimiro Noteví 10-09-2014 19:40:57

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.

Efren2006 11-09-2014 01:19:31

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

ecfisa 11-09-2014 01:55:41

Hola Efren2006
Cita:

Empezado por Efren2006 (Mensaje 481143)
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 :)

Efren2006 11-09-2014 18:16:35

Cita:

Empezado por ecfisa (Mensaje 481146)
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

Casimiro Noteví 11-09-2014 18:22:36

Cita:

Empezado por Efren2006 (Mensaje 481197)
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.
:)

Efren2006 11-09-2014 20:54:03

Cita:

Empezado por ecfisa (Mensaje 481146)

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

ecfisa 12-09-2014 10:00:47

Hola Efren2006.
Cita:

Empezado por Efren2006 (Mensaje 481212)
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 :)

Casimiro Noteví 12-09-2014 10:36:20

^\||/^\||/^\||/

Efren2006 13-09-2014 23:51:57

Cita:

Empezado por ecfisa (Mensaje 481248)
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

ecfisa 14-09-2014 00:56:51

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 :)

Efren2006 14-09-2014 03:03:33

Cita:

Empezado por ecfisa (Mensaje 481403)
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


La franja horaria es GMT +2. Ahora son las 23:45:09.

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