sql >> Databasteknik >  >> RDS >> SQLite

Hur SQLite Random() fungerar

SQLite random() funktion returnerar ett pseudoslumpmässigt heltal mellan -9223372036854775808 och +9223372036854775807.

Ett pseudoslumptal är ett tal som verkar vara slumpmässigt, men som inte är riktigt slumpmässigt. Ett pseudoslumptal är inte riktigt slumpmässigt eftersom dess värde genererades av ett känt frö. Ett pseudoslumptal kommer dock att verka vara slumpmässigt om användaren inte har någon kunskap om fröet eller algoritmen som skapade det.

Därför anses pseudoslumptal ofta vara tillräckligt bra för många tillämpningar.

Exempel

Här är ett exempel på att generera ett pseudoslumptal med random() funktion.

SELECT random();

Resultat:

-882536775989953141

Endast positiva värden

Du kan kombinera random() med abs() för att bara generera positiva värden.

SELECT abs(random());

I det här fallet, om random() genererar ett negativt värde, abs() returnerar det absoluta värdet istället.

För att visa hur abs() fungerar, här är vad som händer om jag skickar det (negativa) slumptalet från det första exemplet till abs() funktion:

SELECT abs(-882536775989953141);

Resultat:

882536775989953141

Så om vi skickar random() till abs() , och random() genererar ett negativt värde, abs() returnerar det värdet som ett positivt värde.

Värde mellan 0 och 100

Här är ett exempel på att generera ett positivt tal mellan 0 och 100.

SELECT abs(random() % 100);

Här är ett exempel på att välja flera slumpmässiga värden.

SELECT 
  abs(random() % 100) AS R1,
  abs(random() % 100) AS R2,
  abs(random() % 100) AS R3;

Resultat:

R1          R2          R3        
----------  ----------  ----------
17          79          90        

Returnera slumpmässiga rader

Du kan använda random() i en ORDER BY sats i en databasfråga för att returnera slumpmässiga rader.

Här är ett exempel.

SELECT * FROM Artist 
ORDER BY random() LIMIT 5;

Resultat:

ArtistId    Name                                    
----------  ----------------------------------------
131         Smashing Pumpkins                       
127         Red Hot Chili Peppers                   
169         Black Eyed Peas                         
60          Santana Feat. Dave Matthews             
240         Gustav Mahler                           

Och det här är vad jag får om jag kör det igen:

ArtistId    Name                                    
----------  ----------------------------------------
234         Orchestra of The Age of Enlightenment   
126         Raul Seixas                             
76          Creedence Clearwater Revival            
182         Nega Gizza                              
63          Santana Feat. Lauryn Hill & Cee-Lo      

Om du har en stor tabell kanske du vill ändra din fråga till något sånt här:

SELECT * FROM Artist 
WHERE ArtistId IN 
  (SELECT ArtistId FROM Artist ORDER BY random() LIMIT 5);

Resultat:

ArtistId    Name                                    
----------  ----------------------------------------
45          Sandra De Sá                            
105         Men At Work                             
110         Nirvana                                 
205         Chris Cornell                           
267         Göteborgs Symfoniker & Neeme Järvi     

  1. Kan en MySQL-utlösare simulera en CHECK-begränsning?

  2. Lägg till en genererad kolumn till en tabell i SQLite

  3. Få de underliggande kolumnerna i en vy baserat på dess resultatuppsättning

  4. Använda String[] selectionArgs i SQLiteDatabase.query()