2016-04-04 344 views
0

我对postgresql非常陌生,我想知道如何去创建一个函数,它将以(888)888-8888格式生成随机电话号码。我甚至无法将我的头围绕如何做到这一点,如果任何人有任何反馈,将是伟大的。Postgresql - 生成随机电话号码的函数

+0

你想要一个随机数还是一大堆?请始终提供您的Postgres版本。 –

+0

如果您希望您的号码符合实际,请确保前三位数字是有效的[NPA](https://en.wikipedia.org/wiki/List_of_North_American_Numbering_Plan_area_codes),接下来的三位是有效的NXX - 其余位数可以是随机的。 – gordy

回答

0

不是最优雅的代码,但它是非常简单,所以应该给你一个基础工作,从:

SELECT '(' 
    || (RANDOM() * 9)::INT 
    || (RANDOM() * 9)::INT 
    || (RANDOM() * 9)::INT 
    || ') ' 
    || (RANDOM() * 9)::INT 
    || (RANDOM() * 9)::INT 
    || (RANDOM() * 9)::INT 
    || '-' 
    || (RANDOM() * 9)::INT 
    || (RANDOM() * 9)::INT 
    || (RANDOM() * 9)::INT 
    || (RANDOM() * 9)::INT; 
0
select regexp_replace(CAST (random() AS text),'^0\.(\d{3})(\d{3})(\d{4}).*$','(\1)\2-\3') AS random; 

随机()函数用于生成介于0的随机数然后是CAST as text and regexp_replace用于添加格式化字符。

更新后垫一些任意的数字串:

select regexp_replace(rpad(CAST (random() AS text),12,CAST(random() AS text)),'^0\.(\d{3})(\d{3})(\d{4}).*$','(\1)\2-\3') AS random; 

没有保证,这将产生有效的电话号码 - 例如区号不能以零或一个开始,但如果你只需要要快速填写一些数字,这应该可以做到。

+1

虽然不太可能,但'random()'可能会产生长度小于10位的数字,在这种情况下,这会失败。 – jgm

+0

@jgm - 好点 - 我添加了第二个版本,用另一组随机数填充字符串。 – user2182349

2

要生成的请求的格式单一,完全随机的号码:

SELECT format('(%s%s%s) %s%s%s-%s%s%s%s' 
    , a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10]) 
FROM (
    SELECT ARRAY (
     SELECT trunc(random() * 10)::int 
     FROM generate_series(1, 10) 
    ) AS a 
    ) sub; 

返回:

(213) 633-4337 

或同级。

1

我想这:

select replace(replace(replace('(@n1) @[email protected]), 
           '@n1', lpad((random()*1000)::int::text, 3, '0') 
          ), '@n2', lpad((random()*1000)::int::text, 3, '0') 
        ), lpad((random()*10000)::int::text, 4, '0') 
      ) 

也就是说,使用三个不同的随机数,每一个分组。

如果您不允许一个或多个元素以零开头,则算法会稍有不同。

+0

我相信第三个应该是'random()* 10000'(不是'1000')。 – pozs