web-dev-qa-db-ja.com

PostgreSQLでランダムな文字列を生成する

このSQLクエリを使用してPostgreSQLでランダムな値を生成しています

chr(ascii('B') + (random() * 25)::integer)

同じクエリを使用して15文字のランダムな文字列を生成するにはどうすればよいですか?

10
Peter Penzov

非常に読みやすい別のソリューション(パフォーマンスは妥当なはずですが、ベンチマークは実行されませんでした):

select substr(md5(random()::text), 0, 25);

必要に応じて大文字にすることができます。

select upper(substr(md5(random()::text), 0, 25));
11
fncomp

これが私の貢献です

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)

許可される文字のセットと文字列の長さを指定できます。

8
Lyndon S

はい、単一のクエリでもこれを行うことができますが、すべての文字を範囲に応じて分離する必要がある場合は、上記が解決策です

SELECT array_to_string(ARRAY(
            SELECT chr((ascii('B') + round(random() * 25)) :: integer) 
            FROM generate_series(1,15)), 
             '');
3
Himanshu sharma

これにより、ソース値定数で構成された文字で構成される長さ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
3
Bennit

アイデアは次のとおりです。

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
2
Gordon Linoff