在PostgreSQL中生成随机字符串

Pet*_*zov 7 sql postgresql postgresql-9.3

我正在使用此SQL查询在PostgreSQL中生成随机值

chr(ascii('B') + (random() * 25)::integer)
Run Code Online (Sandbox Code Playgroud)

如何使用相同的查询生成15个字符随机字符串?

Ben*_*nit 10

这将为您提供一个长度为 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
Run Code Online (Sandbox Code Playgroud)

编辑:要获得多个随机词,您可以使用以下内容:

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
Run Code Online (Sandbox Code Playgroud)


fnc*_*omp 7

另一个很容易阅读的解决方案(性能应该合理,但没有执行基准测试):

select substr(md5(random()::text), 0, 25);
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以将其大写:

select upper(substr(md5(random()::text), 0, 25));
Run Code Online (Sandbox Code Playgroud)


Him*_*rma 6

是的,也可以通过单个查询来做到这一点,但如果你希望每个字符都应该根据范围分开,那么上面是解决方案

SELECT array_to_string(ARRAY(
            SELECT chr((ascii('B') + round(random() * 25)) :: integer) 
            FROM generate_series(1,15)), 
             '');
Run Code Online (Sandbox Code Playgroud)


Lyn*_*n S 6

这是我的贡献

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)
Run Code Online (Sandbox Code Playgroud)

它允许您指定允许的字符集和字符串的长度.


mlo*_*o55 5

我用它来生成随机字符串......

如果您不介意破折号并且启用了 uuid 扩展...

select substr(uuid_generate_v4()::text,1,15);
Run Code Online (Sandbox Code Playgroud)

例如,要在名称列中生成随机字符串,我将使用

select concat('name-', substr(uuid_generate_v4()::text,1,10)) as name;
Run Code Online (Sandbox Code Playgroud)

例如name-91fc72dc-d

否则,请使用 @fncomp 的优秀 md5 示例

nb:启用 uuid 扩展

create extension if not exists "uuid-ossp";
Run Code Online (Sandbox Code Playgroud)

  • 或者您使用 gen_random_uuid() ,它是 Postgres 13+ 以来的核心,不需要扩展,例如 SELECT substr(gen_random_uuid()::text, 1, 8) 。 (4认同)

Gor*_*off 2

这个想法是这样的:

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
Run Code Online (Sandbox Code Playgroud)