Saya perlu memasukkan beberapa nilai acak ke dalam basis data, tetapi saya tidak ingin berakhir dengan teks yang benar-benar acak (seperti 7hfg43d3). Sebaliknya saya ingin memilih secara acak salah satu nilai yang disediakan oleh saya sendiri.
Ide bagus. Saya menyarankan dua penyederhanaan kecil:
('{Foo,Bar,Poo}'::text[])[ceil(random()*3)]
Sintaks yang lebih sederhana menggunakan array literal ( '{Foo,Bar,Poo}'::text[]) Mempersingkat string untuk daftar yang lebih panjang. Manfaat tambahan: deklarasi tipe eksplisit bekerja untuk semua jenis, bukan hanya untuk text. Gagasan orisinal Anda terjadi pada keluaran text, karena itulah tipe default untuk string literal.
Gunakan ceil()sebagai ganti floor() + 1. Hasil yang sama
OK, secara teoritis, batas bawah bisa 0 tepat, seperti yang ditunjukkan dalam komentar Anda , sejak random()menghasilkan ( mengutip manual di sini ):
nilai acak dalam kisaran 0,0 <= x <1,0
Namun, saya belum pernah melihat itu terjadi. Jalankan beberapa juta tes:
@korda: Saya menambahkan lebih banyak, mengatasinya.
Erwin Brandstetter
@ ErwinBrandstetter tidakkah Anda berpikir itu ceil(random())::intakan selalu memberi Anda 1 sehingga Anda tidak akan dapat memeriksa apakah itu akan kembali 0?
aki92
@ aki92: ceil(0.0)tidak akan, itu intinya. OTOH: untuk tujuan tes ini kita mungkin menyederhanakan: WHERE random() = 0.0.
Erwin Brandstetter
@ ErwinBrandstetter oh benar, maaf hanya melewatkan hal itu.
aki92
8
Saya datang dengan ide untuk menggunakan Array untuk mencapai ini:
ceil(random())::int
akan selalu memberi Anda 1 sehingga Anda tidak akan dapat memeriksa apakah itu akan kembali 0?ceil(0.0)
tidak akan, itu intinya. OTOH: untuk tujuan tes ini kita mungkin menyederhanakan:WHERE random() = 0.0
.Saya datang dengan ide untuk menggunakan Array untuk mencapai ini:
sumber
Berdasarkan ide ini, saya telah membuat fungsi yang cukup berguna bagi saya:
Contoh penggunaan:
SELECT random_choice(array['h', 'i', 'j', 'k', 'l']) as random_char;
SELECT random_choice((SELECT array_agg(name) FROM pets)) AS pet_name;
sumber