Saya ingin mengisi kolom secara acak di tabel saya dengan nilai berikut: Tersedia, Ditangguhkan, Uang Muka Sebagian, Terjual/Tidak Tersedia, Token

Saya telah mencoba menggunakan perintah berikut tetapi mengisi seluruh kolom dengan nilai pertama yang didapatnya.

update mytable
set sold_status = (select (array['Available', 'On Hold', 'Partial Downpayment', 'Sold/Unavailable', 'Token Recieved'])[floor(random() * 5 + 1)])

Saya tahu bagaimana mencapai ini dengan bahasa pemrograman, tetapi saya lebih suka kueri PostgreSQL untuk mencapai ini.

0
M.Khan 24 Mei 2021, 16:00

2 jawaban

Jawaban Terbaik

Postgres berpikir itu membantu Anda dengan menjalankan random() hanya sekali -- lupa bahwa random() adalah fungsi yang mudah menguap.

Anda dapat memperbaikinya menggunakan case:

update mytable
    set sold_status = (case (random()*5)::int when 0 then 'Available' when 1 then 'On Hold' when 2 then 'Partial Downpayment' when 3 then 'Sold/Unavailable' when 4 then 'Token Recieved' end);

Ini adalah biola db<>.

0
Gordon Linoff 24 Mei 2021, 13:05

Sementara PostgreSQL melacak volatilitas ekspresi sederhana, PostgreSQL tidak melacak volatilitas sub-pilihan yang tidak berisi referensi ke kueri luar. Anda dapat memperbaikinya dengan memperkenalkan referensi buatan ke kueri luar, tetapi dalam kasus Anda, Anda tidak memerlukan sub-pilih sejak awal, jadi singkirkan saja.

update mytable
set sold_status = (array[
        'Available', 'On Hold', 'Partial Downpayment', 'Sold/Unavailable', 'Token Recieved'
    ]) [floor(random() * 5 + 1)];
0
jjanes 24 Mei 2021, 17:15