Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Random integer (bigint) in Postgre

[es] :: PostgreSQL :: Random integer (bigint) in Postgre
(Zaključana tema (lock), by chachka)

[ Pregleda: 3603 | Odgovora: 3 ] > FB > Twit

Postavi temu

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

jelena_t
Jelena Tadin
php programer
Beograd

Član broj: 178017
Poruke: 55
*.static.sbb.rs.



Profil

icon Random integer (bigint) in Postgre15.04.2008. u 13:23 - pre 135 meseci
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
 
0

michaelk
Michael Kopljan
Software developer
Frankfurt am Main

Član broj: 85498
Poruke: 131
*.adsl.beotel.net.



+26 Profil

icon Re: Random integer (bigint) in Postgre15.04.2008. u 17:15 - pre 135 meseci
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.
 
0

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Moderator
Član broj: 53780
Poruke: 575
*.ADSL.neobee.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: Random integer (bigint) in Postgre15.04.2008. u 20:19 - pre 135 meseci
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)

"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
 
0

jelena_t
Jelena Tadin
php programer
Beograd

Član broj: 178017
Poruke: 55
*.static.sbb.rs.



Profil

icon Re: Random integer (bigint) in Postgre16.04.2008. u 09:12 - pre 135 meseci
Ok, hvala puno :)
 
0

[es] :: PostgreSQL :: Random integer (bigint) in Postgre
(Zaključana tema (lock), by chachka)

[ Pregleda: 3603 | Odgovora: 3 ] > FB > Twit

Postavi temu

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.