[ jelena_t @ 15.04.2008. 13:23 ] @
Treba mi random broj telefona, recimo nesto izmedju 381333111 i 381666999, kako da generisem to unutar f-je u PGadmin-u.... tj da podesim bas taj opseg s obzirom da f-ja random() ne prima parametre |
[ jelena_t @ 15.04.2008. 13:23 ] @
[ michaelk @ 15.04.2008. 17:15 ] @
Mozda nesto ovako :
Code: CREATE OR REPLACE FUNCTION "public"."brtel" () RETURNS bigint AS $body$ DECLARE nBrMin INTEGER := 333111 ; nBrMax INTEGER := 666999 ; nBrTel BIGINT := 0 ; nPrefix INTEGER := 381 ; BEGIN WHILE NOT nBrTel BETWEEN nBrMin AND nBrMax LOOP nBrTel = (random() * ceiling(1000000))::BIGINT ; END LOOP ; -- Format Broj nBrTel = (nPrefix::TEXT || nBrTel::TEXT)::BIGINT ; RETURN nBrTel ; END $body$ LANGUAGE 'plpgsql' STABLE CALLED ON NULL INPUT SECURITY INVOKER; Pozdrav. [ chachka @ 15.04.2008. 20:19 ] @
Ovde se radi o linearnoj funkciji f(x) = a * x + b, f(0) = 381111333, f(1) = 381666999
Lako se dolazi da je to funkcija y = (381666999 - 381111333) * x - 381111333 odnosno y = (381666999 - 381111333) * random() - 381111333 pretvoreno u integere y = trunc((381666999 - 381111333) * random() - 381111333) Rezultat izvršenja random() funkcije je broj iz poluotvoreni interval [0 .. 1). To znači da gornja funkcija nikada ne bi vratila 381666999 kao rezultat. Zbog toga je prava funkcija dobijena povećavanjem onog 'a' parametra za 1 pa se na kraju dobija y = trunc((381666999 - 381111333 + 1) * random() - 381111333) Parametrizovano i pretvoreno u plpgsql dobijamo Code: CREATE OR REPLACE FUNCTION brtel (p_min bigint, p_max bigint) RETURNS bigint AS $body$ BEGIN RETURN trunc((p_max-p_min+1) * random() + p_min); END; $body$ LANGUAGE 'plpgsql' IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER; Funkcija se upotrebljava sa Code: SELECT brtel(381111333, 381666999) [ jelena_t @ 16.04.2008. 09:12 ] @
Ok, hvala puno :)
Copyright (C) 2001-2024 by www.elitesecurity.org. All rights reserved.
|