Algo como STREXTRACT( ) en FIREBIRD

687 views
Skip to first unread message

Arturo Ramos

unread,
May 23, 2014, 12:23:31 AM5/23/14
to publice...@googlegroups.com
Hola foro,

Hay alguna función en FIREBIRD que haga lo que hace STREXTRACT( ) o alguna forma de extraer una cadena de otro.

Saludos,

Arturo Ramos
Cancún, México

Arturo Ramos

unread,
May 23, 2014, 12:41:28 AM5/23/14
to publice...@googlegroups.com
Quizá si explico lo que necesito exista alguna forma...

Quiero llenar un campo de una tabla con una parte de otro campo de la misma tabla:

mvtos.concept = "Mvto-123 Otra cosa"   >>>  mvtos.id_origen = 123

123 que está en una cadena en el campo concept lo quiero en el campo id_origen como entero.

Saludos,

Francisco ji

unread,
May 23, 2014, 9:46:58 AM5/23/14
to publice...@googlegroups.com
Hola Arturo.
 
Te pudiera servir   || para concatenar 2 o mas campos
 
Ej.
TRIM(COALESCE(direccion,' '))||' '|| TRIM(COALESCE(NumExt,' ')) ||'

 
Extraer una parte del campo  puedes usar SUBSTRING  
 
Espero te ayude.
 
Saludos.
 
 

Date: Thu, 22 May 2014 21:41:28 -0700
From: irc...@gmail.com
To: publice...@googlegroups.com
Subject: [vfp] Re: Algo como STREXTRACT( ) en FIREBIRD

Víctor Hugo Espínola Domínguez

unread,
May 23, 2014, 6:20:54 PM5/23/14
to publice...@googlegroups.com
Hola Arturo

Puedes crear un procedimiento almacenado o una función externa, dll en algún lenguaje.

No tengo ahora el Firebird instalado, pero el procedimiento sería algo así:

SET TERM ^ ;

CREATE PROCEDURE StrExtract(cTexto VARCHAR(100)
                                                    , cDelimIni CHAR(1)
                                                   , cDelimFin CHAR(1)
                                                     )
RETURNS (cStrExtract VARCHAR(20))
AS
DECLARE nPosIni    INTEGER;
DECLARE nPosFin    INTEGER;
DECLARE nKntCar    INTEGER;
BEGIN
       cStrExtract = ''
       nPosIni      = POSITION(cDelimIni, cTexto);
       nPosFin     = POSITION(cDelimFin, cTexto);

       IF (nPosIni > 0) THEN
            BEGIN
                  IF (nPosFin > nPosIni) THEN
                       BEGIN
                              nKntCar = nPosFin - nPosIni - 1;
                              cStrExtract = SUBSTRING(cTexto, nPosIni + 1, nKntCar);
                       END
                 ELSE
                       cStrExtract = SUBSTRING(cTexto, nPosIni + 1);
            END

           SUSPEND;
END
^

SET TERM ;


Queda a tu cargo las correcciones de los errores de sintaxis que pudieran haber.

Este procedimiento fallará si los delimitadores no son respetados, por ejemplo:

"Mvto_123 Otra cosa"
"Mvto: 123 Otra cosa"
"Mvto.123 Otra cosa"
"Mvto-123Otra cosa"

Un algoritmo más seguro es extraer la primera cadena de dígitos que aparezca en el texto:

SET TERM ^ ;

CREATE PROCEDURE DigExtract(cTexto VARCHAR(100))

RETURNS (cDigExtract VARCHAR(20))
AS
DECLARE nKntCar    INTEGER;
DECLARE i                INTEGER;
DECLARE cCar         CHAR(1);

BEGIN
    cDigExtract = '';
    nKntCar     = CHAR_LENGTH((TRIM(cTexto));
    i                 = 1;
    WHILE (i <= nnKntCar) DO
           BEGIN
                   cCar = SUBSTRING(cTexto, i, 1);
                   IF (cCar >= '0' AND cCar <= '9') THEN
                          cDigExtract = cDigExtract || cCar;
                   ELSE
                          IF (CHAR_LENGTH(cDigExtract) > 0) THEN
                                 LEAVE;
                   i = i + 1;
            END

    SUSPEND;
END
^

SET TERM ;

Saludos,
Víctor.
Lambaré - Paraguay.

 

Arturo Ramos

unread,
May 23, 2014, 6:53:00 PM5/23/14
to publice...@googlegroups.com
Victor y Francisco gracias por contestar,

Victor no intento encadenar sino obtener una cadena de otra y no me sirve SUBSTR() por que la cadena de origen puede ser "Mvto-1 Algo", "Mvto-123456789 Otra cosa", "Mvto-345", y de estos debo obtener "1", "123456789" y "345".

Francisco, ya hice un código en VFP que hace la consulta y usando VAL(STREXTRACT(ALLTRIM(temp.concept), "Mov-", " ", 1)) obtengo el valor numérico y luego guardo en la tabla de FIREBIRD ese valor, pero lo quiero hacer desde FIREBIRD de ser posible por que son varias bases de datos por actualizar y se me haría más fácil con un script directo en la base de datos.

Por el momento para las pruebas que necesito hacer lo solucione así pero si exite alguna forma de hacerlo desde la base sería genial.

Gracias por su tiempo.

Saludos,

Arturo Ramos
Cancún, México.

Víctor Hugo Espínola Domínguez

unread,
May 23, 2014, 7:11:21 PM5/23/14
to publice...@googlegroups.com
Hola Arturo

Los dos procedmientos que te envié hacen lo que quieres, solo les falta el CAST desde Varchar a Integer.

Saludos,
Víctor.
Lambaré - Paraguay.

Reply all
Reply to author
Forward
0 new messages