Preciso colocar alguns valores aleatórios no banco de dados, mas não quero terminar com um texto completamente aleatório (como 7hfg43d3). Em vez disso, gostaria de escolher aleatoriamente um dos valores fornecidos por mim.
relate perguntas
-
Posso ativar o PITR depois que o banco de dados foi usado
-
Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo
-
Os procedimentos armazenados impedem a injeção de SQL?
-
Sequências Biológicas do UniProt no PostgreSQL
-
Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?
Boa ideia. Sugiro duas pequenas simplificações:
Sintaxe mais simples usando um array literal (
'{Foo,Bar,Poo}'::text[]
) Encurta a string para listas mais longas. Benefício adicional: declaração de tipo explícito funciona para qualquer tipo, não apenas paratext
. Sua ideia original acontece com outputtext
, porque esse é o tipo padrão para strings literais.Use
ceil()
em vez defloor() + 1
. Mesmo resultado.OK, teoricamente, o limite inferior poderia ser 0 precisamente, conforme sugerido em seu comentário , pois
random()
produz ( citando o manual aqui ):No entanto, nunca vi isso acontecer. Execute alguns milhões de testes:
-> SQLfiddle
Para estar perfeitamente seguro, porém, você pode usar subscritos de matriz personalizados do Postgres e ainda evitar a adição extra:
Ver:
Melhor ainda, use
trunc()
, que é um pouco mais rápido.Tive a ideia de usar Arrays para fazer isso:
Com base nessa ideia, criei uma função que foi bastante útil para mim:
Exemplos de uso:
SELECT random_choice(array['h', 'i', 'j', 'k', 'l']) as random_char;
SELECT random_choice((SELECT array_agg(name) FROM pets)) AS pet_name;