Мне нужно поместить несколько случайных значений в базу данных, но я не хочу, чтобы в конечном итоге был полностью рандомизированный текст (например, 7hfg43d3). Вместо этого я хотел бы случайно выбрать одно из значений, предоставленных мной.
Простой синтаксис с использованием массива literal ( '{Foo,Bar,Poo}'::text[]) Сокращает строку для более длинных списков. Дополнительное преимущество: явное объявление типа работает для любого типа, а не только для text. Ваша оригинальная идея происходит с выводом text, потому что это тип по умолчанию для строковых литералов.
Используйте ceil()вместо floor() + 1. Тот же результат.
Однако, чтобы быть в полной безопасности, вы можете использовать пользовательские подписки на массивы Postgres и по-прежнему избегать дополнительного добавления:
ceil(random())::int
это всегда даст вам 1, так что вы не сможете проверить, вернется ли он когда-нибудь 0?ceil(0.0)
нет, в этом все дело. Ото: для целей этого теста мы могли бы упростить:WHERE random() = 0.0
.Я пришел с идеей использовать массивы для достижения этой цели:
источник
Основываясь на этой идее, я создал функцию, которая была очень полезна для меня:
Примеры использования:
SELECT random_choice(array['h', 'i', 'j', 'k', 'l']) as random_char;
SELECT random_choice((SELECT array_agg(name) FROM pets)) AS pet_name;
источник