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
Random integer (bigint) in Postgre
Zaključano
Zakačeno
Mozda nesto ovako :
Pozdrav.
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;
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.
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
Funkcija se upotrebljava sa
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;
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)
SELECT brtel(381111333, 381666999)
Potpis
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming." - Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming." - Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
Ok, hvala puno :)
Tema je zaključana, nove poruke nisu moguće.