FAQ
Buenas, quería comentaros un problema con el que me estoy encontrando y que (pese a que probablemente sea una tontería) me está llevando de craneo:
Tengo una función con la que pretendo comprobar que el primer carácter de un campo textual sea 'F'. La función tiene este código:
BEGIN EXECUTE 'select substring(s1.'|| $2||'::text from '|| $4||' for '|| $5||') from '|| $1||' as s1 where s1.gid='|| $3||' and substring(s1.'|| $2||'::text from '|| $4||' for '|| $5||')='''|| $6||'''::text;'; IF FOUND THEN RETURN true; ELSE RETURN false; END IF;END;
Y la llamada la realizo tal que así: select devuelve_booleano('x2bis','txt', '5', '1','1','F')
La explicación de los parámetros:
/*Comprueba en el registro $3 del campo textual $2 de la tabla $1*//*si los $5 siguientes carácteres a la posición $4*//*coincide con el valor $6*/
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Para el caso particular de esta query: select substring(s1.txt::text from 1 for 1) from x2bis as s1 where s1.gid=5 el resultado es 'F'
Pero la función me está devolviendo 'false' en todo momento independientemente del carácter que tenga que buscar en el parámetro 6º
¿Alguien sabe que puedo estar haciendo mal?
Gracias por la ayuda.

Search Discussions

  • Álvaro Hernández Tortosa at May 23, 2011 at 2:44 pm
    Mon, May 23, 2011 at 02:28:13PM +0200, Néstor Seguí Martínez escribió:
    Buenas, quería comentaros un problema con el que me estoy encontrando y que (pese a que probablemente sea una tontería) me está llevando de craneo:
    Tengo una función con la que pretendo comprobar que el primer carácter de un campo textual sea 'F'. La función tiene este código:
    BEGIN EXECUTE 'select substring(s1.'|| $2||'::text from '|| $4||' for '|| $5||') from '|| $1||' as s1 where s1.gid='|| $3||' and substring(s1.'|| $2||'::text from '|| $4||' for '|| $5||')='''|| $6||'''::text;'; IF FOUND THEN RETURN true; ELSE RETURN false; END IF;END;
    Y la llamada la realizo tal que así: select devuelve_booleano('x2bis','txt', '5', '1','1','F')
    La explicación de los parámetros:
    /*Comprueba en el registro $3 del campo textual $2 de la tabla $1*//*si los $5 siguientes carácteres a la posición $4*//*coincide con el valor $6*/
    --------------------------------------------------------------------------------------------------------------------------------------------------------------
    Para el caso particular de esta query: select substring(s1.txt::text from 1 for 1) from x2bis as s1 where s1.gid=5 el resultado es 'F'
    Pero la función me está devolviendo 'false' en todo momento independientemente del carácter que tenga que buscar en el parámetro 6º
    ¿Alguien sabe que puedo estar haciendo mal?
    Gracias por la ayuda.
    Hola, Néstor.

    Yo haría una función independiente de las tablas (que la función
    no extraiga de tablas), porque así es más portable (puedes usarlo en
    datos que no provengan de tablas) y mucho más sencillo. Por ejemplo:

    CREATE FUNCTION starts_with (text, char(1)) RETURNS boolean AS $$
    SELECT $2 = substring($1, 1, 1)
    $$ LANGUAGE SQL;

    Y se puede usar sin tabla:

    => SELECT starts_with('Funcion', 'F');
    starts_with
    -------------
    t
    (1 row)

    O con una tabla cualquiera, pasándole la columna como primer argumento y
    usarlo en cualquier expresión de la consulta.

    Luego puedes ir mejorando la función, con más parámetros, si lo
    deseas.

    Espero que te sea de utilidad. Saludos,

    Álvaro

    --

    Álvaro Hernández Tortosa


    -----------
    NOSYS
    Networked Open SYStems

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
grouppgsql-es-ayuda @
categoriespostgresql
postedMay 23, '11 at 12:28p
activeMay 23, '11 at 2:44p
posts2
users2
websitepostgresql.org.es
irc#postgresql

People

Translate

site design / logo © 2022 Grokbase