Setten rastgele değer ayarla


11

Ben veritabanına bazı rasgele değerler koymak gerekir, ama tamamen rastgele metin (7hfg43d3 gibi) ile bitirmek istemiyorum. Bunun yerine kendim tarafından sağlanan değerlerden birini rastgele seçmek istiyorum.

Yanıtlar:


26

İyi fikir. İki küçük basitleştirme öneriyorum:

('{Foo,Bar,Poo}'::text[])[ceil(random()*3)]
  • Değişmez dizi kullanarak daha basit sözdizimi ( '{Foo,Bar,Poo}'::text[]) Dizeyi daha uzun listeler için kısaltır. Ek fayda: açık tür bildirimi, sadece tür için değil, her tür için çalışır text. Orijinal fikriniz çıktı alır text, çünkü bu dizi değişmezleri için varsayılan türdür.

  • Yerine ceil()kullanın floor() + 1. Aynı sonuç.

Tamam, teorik olarak, alt kenarlık , yorumunuzda ima edildiği gibi, tam olarak 0 olabilir , çünkü random()üretir ( burada kılavuzdan alıntı yapılır ):

0.0 <= x <1.0 aralığında rastgele değer

Ancak, bunun olduğunu hiç görmedim. Birkaç milyon test yapın:

SELECT count(*)
FROM   generate_series(1,1000000)
WHERE  ceil(random())::int = 0;

-> SQLfiddle

Bununla birlikte, mükemmel bir şekilde güvende olmak için Postgres özel dizi aboneliklerini kullanabilir ve yine de ek eklemeden kaçınabilirsiniz:

('[0:2]={Foo,Bar,Poo}'::text[])[floor(random()*3)]

SO ile ilgili bu sorunun altındaki ayrıntılar.

Ya da daha iyisi, kullanın trunc(), bu biraz daha hızlı.

('[0:2]={Foo,Bar,Poo}'::text[])[trunc(random()*3)]

tavan (0) == kat (0) + 1?
korda

@korda: Buna değinerek daha fazlasını ekledim.
Erwin Brandstetter

@ErwinBrandstetter bunun ceil(random())::inther zaman 1 vereceğini düşünmüyor musunuz, böylece 0'a dönüp dönmeyeceğini kontrol edemeyeceksiniz mi?
aki92

@ aki92: ceil(0.0)yapmazdım, mesele bu. Otoh: Bu testin amacı için biz basitleştirmek olabilir: WHERE random() = 0.0.
Erwin Brandstetter

@ErwinBrandstetter oh doğru, özür dilerim o şeyi kaçırdım.
aki92

8

Bunu başarmak için Diziler kullanma fikri buldum:

(ARRAY['Foo','Bar','Poo'])[floor(random()*3)+1]

0

Bu fikre dayanarak, benim için oldukça yararlı bir işlev oluşturdum:

CREATE OR REPLACE FUNCTION random_choice(
    choices text[]
)
RETURNS text AS $$
DECLARE
    size_ int;
BEGIN
    size_ = array_length(choices, 1);
    RETURN (choices)[floor(random()*size_)+1];
END
$$ LANGUAGE plpgsql;

Kullanım örnekleri:

  • SELECT random_choice(array['h', 'i', 'j', 'k', 'l']) as random_char;

  • SELECT random_choice((SELECT array_agg(name) FROM pets)) AS pet_name;


Bu işlevi, kişisel olarak daha kullanıcı dostu bulduğum değişken parametresine sahip bir işleve dönüştürebilirsiniz .
Sahap Asci
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.