sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan Random() virker i PostgreSQL

I PostgreSQL er random() funktion returnerer en pseudo-tilfældig værdi i området 0,0 <=x <1,0.

Den bruger en simpel lineær kongruentiel algoritme, som er en af ​​de ældste og bedst kendte pseudo-tilfældige talgeneratoralgoritmer.

Et pseudo-tilfældigt tal er et tal, der ser ud til at være tilfældigt, men som ikke er sandt tilfældigt. Et pseudo-tilfældigt tal er ikke sandt tilfældigt, fordi dets værdi blev genereret af et kendt frø. Det vil dog se ud til at være tilfældigt, hvis brugeren ikke har kendskab til frøet eller algoritmen, der skabte det.

Derfor anses pseudo-tilfældige tal ofte for at være gode nok til mange applikationer.

Eksempel

Her er et eksempel på generering af et pseudo-tilfældigt tal med random() funktion.

SELECT random();

Resultat:

0.625357600199532

Resultatet vil naturligvis være anderledes hver gang du kalder det.

Her er et andet eksempel, hvor jeg kalder funktionen tre gange i samme sætning.

SELECT 
  random(),
  random(),
  random();

Resultat:

 random            | random              | random
-------------------+---------------------+--------------------
 0.594431747016209 | 0.22816249693650903 | 0.7168820259873314

Tilfældigt tal mellem 1 og 10

Her er et eksempel på generering af et positivt tal mellem 0 og 10.

SELECT random() * 10 + 1;

Resultat:

4.564859004063727

For at være klar, genererer dette et tilfældigt tal, der er>=1 og <10.

Tilfældigt heltal

Du kan bruge en funktion såsom trunc() eller floor() for at returnere det tilfældige tal som et heltal.

SELECT 
  trunc(random() * 10 + 1),
  floor(random() * 10 + 1);

Resultat:

 trunc | floor
-------+-------
     1 |     8

Returner tilfældige rækker

Du kan bruge random() i en ORDER BY klausul i en databaseforespørgsel for at returnere tilfældige rækker.

Her er et eksempel, der forespørger på pagila eksempeldatabase.

SELECT 
  film_id,
  title
FROM film 
ORDER BY random() LIMIT 5;

Resultat:

 film_id |        title        
---------+---------------------
     116 | CANDIDATE PERDITION
     806 | SLEEPY JAPANESE
     892 | TITANIC BOONDOCK
     826 | SPEED SUIT
     612 | MUSSOLINI SPOILERS

Og her er, hvad jeg får, hvis jeg kører det igen:

 film_id |       title        
---------+--------------------
     450 | IDOLS SNATCHERS
     827 | SPICE SORORITY
     593 | MONTEREY LABYRINTH
     529 | LONELY ELEPHANT
     591 | MONSOON CAUSE

Hvis du har en stor tabel, og du skal returnere alle rækker (eller mange rækker), vil du måske ændre din forespørgsel til noget som dette:

SELECT *
FROM film 
WHERE film_id IN 
  (SELECT film_id FROM film ORDER BY random() LIMIT 5);

Opret gentagelige tilfældige tal

Postgres har også en setseed() funktion, der giver dig mulighed for at indstille et seed for efterfølgende random() opkald inden for samme session.

Du kan bruge setseed() for at generere gentagelig random() opkald.

Se hvordan Setseed() virker i Postgres for eksempler.


  1. Hvordan man evaluerer udtryk i select statement i Postgres

  2. En oversigt over Quests nyeste databaseovervågningstjeneste - Spotlight Cloud

  3. Laravel 5 PDOException kunne ikke finde driver

  4. Sådan trækker du minutter fra en dato-tidsværdi i MariaDB