세트에서 임의의 값 설정


11

데이터베이스에 임의의 값을 입력해야하지만 7hfg43d3과 같은 완전히 무작위 텍스트로 끝나고 싶지 않습니다. 대신 직접 제공 한 값 중 하나를 임의로 선택하고 싶습니다.

답변:


26

좋은 생각. 두 가지 사소한 단순화를 제안합니다.

('{Foo,Bar,Poo}'::text[])[ceil(random()*3)]
  • 배열 리터럴 ( '{Foo,Bar,Poo}'::text[])을 사용하는 간단한 구문 더 긴 목록을 위해 문자열을 줄입니다. 추가 이점 : 명시 적 형식 선언은을위한 것이 아니라 모든 형식에 사용할 수 있습니다 text. text문자열 리터럴의 기본 유형이므로 원래 아이디어가 출력 됩니다.

  • ceil()대신에 사용하십시오 floor() + 1. 같은 결과입니다.

에 암시로 OK, 이론적으로 아래쪽 테두리는 정확히 0이 될 수 귀하의 코멘트 이후 random()(생산 여기 설명서를 인용 ) :

0.0 <= x <1.0 범위의 난수

그러나 나는 그런 일을 본 적이 없다. 몇 백만 테스트를 실행하십시오.

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

-> SQLfiddle

완벽하게 안전하기 위해 Postgres 사용자 정의 배열 첨자를 사용하고 추가 추가를 피할 수 있습니다.

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

SO에 대한이 관련 질문에 대한 세부 정보.

또는 더 나은 아직, 사용 trunc(), 그 조금 더 빠르다.

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

ceil (0) == floor (0) + 1?
korda

@ Korda : 나는 그것을 추가로 추가했습니다.
Erwin Brandstetter

@ ErwinBrandstetter ceil(random())::int항상 1을 줄 것이라고 생각하지 않으므로 0을 반환하는지 확인할 수 없습니다.
aki92

@ aki92 : ceil(0.0)그렇지 않을 것입니다. OTOH :이 테스트의 목적을 위해 다음을 단순화 할 수 있습니다 WHERE random() = 0.0..
Erwin Brandstetter

@ErwinBrandstetter 아 사실, 미안 그냥 그 일을 놓쳤다.
aki92

8

이것을 달성하기 위해 Arrays를 사용하는 아이디어를 생각해 냈습니다.

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

0

이 아이디어를 바탕으로 저에게 매우 유용한 기능을 만들었습니다.

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;

사용 예 :

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

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


당신이 가진 기능으로이 기능을 변신 할 수 가변 저는 개인적으로 더 사용자 친화적 찾을 매개 변수입니다.
Sahap Asci
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.