このSQLクエリを使用してPostgreSQLでランダムな値を生成しています
chr(ascii('B') + (random() * 25)::integer)
同じクエリを使用して15文字のランダムな文字列を生成するにはどうすればよいですか?
非常に読みやすい別のソリューション(パフォーマンスは妥当なはずですが、ベンチマークは実行されませんでした):
select substr(md5(random()::text), 0, 25);
必要に応じて大文字にすることができます。
select upper(substr(md5(random()::text), 0, 25));
これが私の貢献です
postgres=# SELECT array_to_string(array(select substr('ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789',((random()*(36-1)+1)::integer),1) from generate_series(1,50)),'');
array_to_string
----------------------------------------------------
4XOS6TQG5JORLF3D1RPXUWR2FQKON9HIXV0UGH0CQFT1LN5D4L
(1 row)
許可される文字のセットと文字列の長さを指定できます。
はい、単一のクエリでもこれを行うことができますが、すべての文字を範囲に応じて分離する必要がある場合は、上記が解決策です
SELECT array_to_string(ARRAY(
SELECT chr((ascii('B') + round(random() * 25)) :: integer)
FROM generate_series(1,15)),
'');
これにより、ソース値定数で構成された文字で構成される長さ15のランダムな単語が得られます。
select
string_agg(substr(characters, (random() * length(characters) + 1)::integer, 1), '') as random_Word
from (values('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')) as symbols(characters)
-- length of Word
join generate_series(1, 15) on 1 = 1
編集:複数のランダムな単語を取得するには、以下を使用できます:
with symbols(characters) as (VALUES ('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'))
select string_agg(substr(characters, (random() * length(characters) + 1) :: INTEGER, 1), '')
from symbols
join generate_series(1,8) as Word(chr_idx) on 1 = 1 -- Word length
join generate_series(1,10000) as words(idx) on 1 = 1 -- # of words
group by idx
アイデアは次のとおりです。
select (chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer) ||
chr(ascii('B') + (random() * 25)::integer)
) as Random15