Maybaygiare.org

Blog Network

Vlad Mihalcea

sist endret:

Tenk deg å ha et verktøy som automatisk kan oppdage jpa og Dvalemodus ytelsesproblemer. Hypersistence Optimizer er det verktøyet!

Introduksjon

I denne artikkelen skal Vi se hvordan VI kan sortere ET SQL-spørringsresultatsett ved hjelp av EN ORDER BY-klausul som tar EN TILFELDIG funksjon levert av en databasespesifikk funksjon.

Dette er et veldig praktisk triks, spesielt når du vil blande et gitt resultatsett.

Merk at sortering av et stort resultatsett ved HJELP av EN TILFELDIG funksjon kan vise seg å være veldig sakte, så sørg for at du gjør det på små resultatsett.

Hvis du må blande et stort resultatsett og begrense det etterpå, er det bedre å bruke Noe som Oracle SAMPLE(N) ellerTABLESAMPLE I SQL Server eller PostgreSQL i stedet for en tilfeldig funksjon I ORDER BY-klausulen.

Databasetabell

la oss anta at vi utvikler en musikkspiller desktop applikasjon, og vi har følgende song tabell i vår database.

tabellen for sangdatabasen

tabellen for sangdatabasen

tabellen for song :

id artist title
1 Miyagi & Эндшпиль ft. Рем Дигга I Got Love
2 HAIM Don’t Save Me (Cyril Hahn Remix)
3 2Pac ft. DMX Stigning Av En Mester (GalilHD Remix)
4 &Passasjer Ingen Diggity (Kygo Remix)
5 jp cooper ft. Mali-Koa All This Love

Ved HJELP AV EN TILFELDIG funksjon i SQL ORDER BY-klausulen

vi vil blande sanglisten slik at hver ny spilleliste er annerledes enn en tidligere generert en. Når vi trenger å sortere et GITT SQL – spørringsresultatsett, må vi bruke ORDER BY-klausulen.

men for å randomisere de returnerte radene, trenger VI ORDER BY-setningen for å bruke en funksjon eller databaseobjekt som returnerer en tilfeldig verdi for hver rad som finnes i SQL-resultatsettet.

som allerede nevnt, bruker en databasespesifikk funksjon som returnerer tilfeldige verdier, bare for små resultatsett, da ELLERS VIL SQL-spørringsytelsen bli påvirket. Heldigvis, i vårt tilfelle, representerer song tabellen gjeldende spilleliste av et skrivebordsprogram, derfor er størrelsen på resultatsettet rimelig.

Oracle

På Oracle må du brukeDBMS_RANDOM.VALUE funksjonen, som illustrert ved følgende eksempel:

SELECT artist||' - '||title AS songFROM songORDER BY DBMS_RANDOM.VALUE

når DU utfører SQL-spørringen ovenfor På Oracle, oppnås følgende resultatsett:

sang

HAIM – Ikke Redde Meg (Cyril Hahn Remix)

Ed Sheeran &Passasjer – Ingen Diggity (Kygo Remix)

Miyagi &Эндшпиль Ft. Рем дигга – Jeg Fikk Kjærlighet

jp cooper ft. Mali-Koa-Alt Dette Kjærlighet

2Pac ft. DMX-Rise Of A Champion (GalilHD Remix)

Legg merke til at sangene blir oppført i tilfeldig rekkefølge, takket væreDBMS_RANDOM.VALUE funksjonskall brukt AV ORDER BY-klausulen.

VALUE – funksjonen iDBMS_RANDOM – pakken returnerer en numerisk verdi i [0, 1) – intervallet med en presisjon på 38 fraksjonelle sifre.

SQL Server

PÅ SQL Server må du bruke NEWID funksjonen, som illustrert ved følgende eksempel:

SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY NEWID()

når DU utfører SQL-spørringen ovenfor PÅ SQL Server, er følgende resultatsett oppnådd:

sang

miyagi & эндшпиль ft. Рем дигга – Jeg Fikk Kjærlighet

haim – ikke redd meg (CYRIL Hahn Remix)

2pac ft. DMX-Fremveksten Av En Mester (GalilHD Remix)

Ed Sheeran & Passasjer – Ingen Diggity (Kygo Remix)

Jp Cooper ft. Mali – Koa-All This Love

Legg Merke til at sangene blir oppført i tilfeldig rekkefølge, takket væreNEWID() funksjonskall som brukes AV ORDER BY-klausulen.

NEWID-funksjonen returnerer en uniqueidentifier datatype som representerer EN 16-byte GUID. Derfor vil hver ny verdi returnert avNEWID – funksjonen være nesten unik.

PostgreSQL

På PostgreSQL må du brukerandom funksjonen, som illustrert ved følgende eksempel:

SELECT artist||' - '||title AS songFROM songORDER BY random()

når DU utfører SQL-spørringen ovenfor På PostgreSQL, følgende resultatsett er oppnådd:

sang

jp Cooper Ft. Mali-Koa-Alt Dette Kjærlighet

2Pac ft. DMX-Fremveksten Av En Mester (GalilHD Remix)

HAIM-Ikke Redde Meg (Cyril Hahn Remix)

Ed Sheeran & Passasjer – Ingen Diggity (Kygo Remix)

Miyagi & Эндшпиль Ft. Рем дигга – I Got Love

legg merke til at sangene blir oppført i tilfeldig rekkefølge, takket være random() funksjonskall som brukes av order by-klausulen.

random – funksjonen returnerer en numerisk verdi i [0, 1) – intervallet tildouble precision – typen.

MySQL

På MySQL må du bruke RAND funksjonen, som illustrert ved følgende eksempel:

SELECT CONCAT(CONCAT(artist, ' - '), title) AS songFROM songORDER BY RAND()

når DU utfører SQL-spørringen ovenfor På MySQL, oppnås følgende resultatsett:

sang

2pac ft. DMX-Fremveksten Av En Mester (GalilHD Remix)

JP Cooper ft. Mali-Koa-All Denne Kjærligheten

Miyagi & Эндшпиль Ft. Рем дигга – Jeg Fikk Kjærlighet

ed sheeran & passasjer – ingen diggity (Kygo Remix)

haim – ikke lagre meg (CYRIL Hahn Remix)

legg merke til at sangene blir oppført i tilfeldig rekkefølge, takket være RAND() funksjon call brukes Av Order By-Klausulen.

RAND funksjonen returnerer en numerisk verdi i [0, 1) – intervallet av en flyttallstype.

JPA og Hibernate

når du bruker jpa og Hibernate entitetsforespørsler, kan du bare sende tilfeldig funksjon TIL ORDER BY-klausulen som illustrert av følgende jpql-spørring:

List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY random()", Song.class).getResultList();

Jpql-spørringen ovenfor vil fungere fint for PostgreSQL, SQL Server og MySQL siden random()NEWID() ELLER RAND() FUNKSJONER vil bli overført av dvalemodus som det er til sql-rekkefølgen ved.

For Oracle, siden tilfeldigheten er gitt avDBMS_RANDOM.VALUE nummergenerator, må du referere den som EN SQL-funksjon (f. eks. DBMS_RANDOM.VALUE()):

List<Song> songs = entityManager.createQuery( "SELECT s " + "FROM Song s " + "ORDER BY DBMS_RANDOM.VALUE()", Song.class).getResultList();

Det er det!

Online Workshops

hvis du likte denne artikkelen, vedder jeg på at du kommer til å elske min kommende 4-dagers Online Workshop!

  • Høy Ytelse Java Utholdenhet Online Workshop (4 timer x 4 dager) mellom 19.og 22. April

Konklusjon

Randomisering AV SQL-spørringen resultatsettet er et vanlig krav, så det er nyttig å vite hvilken sql-funksjon du kan bruke I order by-Setningsdelen, Avhengig Av Den Underliggende Relasjonsdatabasetypen.

Transactions and Concurrency Control eBook

High-Performance Java Persistence rocks!
High-Performance Java Persistence Online Workshop
Hypersistence Optimizer rocks!

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.