为了打乱 SQL 结果集,您需要使用特定于数据库的函数调用。
请注意,使用 RANDOM 函数对大型结果集进行排序可能会非常慢,因此请确保对小型结果集进行排序。
如果您必须对大型结果集进行洗牌并在之后对其进行限制,那么最好在SQL Server 或PostgreSQL 中使用Oracle SAMPLE(N) 或TABLESAMPLE 之类的东西,而不是在ORDER BY 中使用随机函数子句。
所以,假设我们有以下数据库表:
以及song 表中的以下行:
| id | artist | title |
|----|---------------------------------|------------------------------------|
| 1 | Miyagi & Эндшпиль ft. Рем Дигга | I Got Love |
| 2 | HAIM | Don't Save Me (Cyril Hahn Remix) |
| 3 | 2Pac ft. DMX | Rise Of A Champion (GalilHD Remix) |
| 4 | Ed Sheeran & Passenger | No Diggity (Kygo Remix) |
| 5 | JP Cooper ft. Mali-Koa | All This Love |
甲骨文
在 Oracle 上,您需要使用 DBMS_RANDOM.VALUE 函数,如下例所示:
SELECT
artist||' - '||title AS song
FROM song
ORDER BY DBMS_RANDOM.VALUE
在 Oracle 上运行上述 SQL 查询时,我们将得到以下结果集:
| song |
|---------------------------------------------------|
| JP Cooper ft. Mali-Koa - All This Love |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
请注意,由于 ORDER BY 子句使用了DBMS_RANDOM.VALUE 函数调用,歌曲是按随机顺序列出的。
SQL 服务器
在 SQL Server 上,您需要使用NEWID 函数,如下例所示:
SELECT
CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY NEWID()
在 SQL Server 上运行上述 SQL 查询时,我们将得到以下结果集:
| song |
|---------------------------------------------------|
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
| JP Cooper ft. Mali-Koa - All This Love |
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
请注意,由于 ORDER BY 子句使用了 NEWID 函数调用,歌曲是按随机顺序列出的。
PostgreSQL
在 PostgreSQL 上,您需要使用random 函数,如下例所示:
SELECT
artist||' - '||title AS song
FROM song
ORDER BY random()
在 PostgreSQL 上运行上述 SQL 查询时,我们将得到以下结果集:
| song |
|---------------------------------------------------|
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| JP Cooper ft. Mali-Koa - All This Love |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
请注意,由于 ORDER BY 子句使用了random 函数调用,歌曲是按随机顺序列出的。
MySQL
在 MySQL 上,您需要使用 RAND 函数,如下例所示:
SELECT
CONCAT(CONCAT(artist, ' - '), title) AS song
FROM song
ORDER BY RAND()
在 MySQL 上运行上述 SQL 查询时,我们将得到以下结果集:
| song |
|---------------------------------------------------|
| HAIM - Don't Save Me (Cyril Hahn Remix) |
| Ed Sheeran & Passenger - No Diggity (Kygo Remix) |
| Miyagi & Эндшпиль ft. Рем Дигга - I Got Love |
| 2Pac ft. DMX - Rise Of A Champion (GalilHD Remix) |
| JP Cooper ft. Mali-Koa - All This Love |
请注意,由于 ORDER BY 子句使用了 RAND 函数调用,歌曲是按随机顺序列出的。