Postgre:从范围生成 uniq 随机字符串

Postgre: generate uniq random string from range

提问人:Lex_One 提问时间:4/22/2023 最后编辑:Lex_One 更新时间:4/23/2023 访问量:74

问:

我想从范围和表中尚不存在的文本值中生成一个随机文本值。

对于考试,我的范围从“abcdef”到“abcdej”。

我有一个 where id 必须是唯一的。tableA(id varchar(6), someData)

我想从列表('abcdef','abcdeg','abcdeh','abcdei','abcdej')等范围生成文本值 并检查它是否不在 tableA 中。

有什么办法可以做到吗?(最好不需要额外的程序)

更新:

  1. 生成的值应该成为新 ID
  2. 例如:范围从“FOOBARA”到“FOOBARZ”。tableA 中已经存在从 'FOOBARB' 到 'FOOBARV' 的值。结果必须从以下列表中随机选择:'FOOBARA'、'FOOBARW'、'FOOBARX'、'FOOBARY'、'FOOBARZ'。
  3. 在实践中,范围和字符串的长度将是 8 或 15 个字符,因此在长度上下文中不需要通用性。假定范围的边界指定正确且长度相同。
PostgreSQL 范围 数据生成

评论

0赞 Adrian Klaver 4/22/2023
这需要更多的信息:1)生成的值是否应该成为新的?2) 提供一些预期输出值的示例。3) 字符串的长度是否必须正好为 6 个字符?将上述答案添加为问题的更新id
0赞 Addell El-haddad 4/23/2023
检查此 dba.stackexchange.com/questions/301181/...

答:

0赞 Lex_One 4/23/2023 #1

这是一个糟糕的解决方案,因为它需要很长时间并消耗大量资源,但如果您在较小规模上遇到类似的问题,这可能适合您:

WITH RECURSIVE Tuple AS
(
  SELECT
    CAST(charr AS Text) AS Tuple
   ,1 AS TupleLength
  FROM (select regexp_split_to_table('QWERTYUIOPASDFGHJKLZXCVBNM1234567890', '') charr) all_chars

  UNION ALL

  SELECT
    T.Tuple || E.charr
   ,TupleLength + 1
  FROM Tuple T
  INNER JOIN (select regexp_split_to_table('QWERTYUIOPASDFGHJKLZXCVBNM1234567890', '') charr) E ON E.charr >= RIGHT(T.Tuple,1)
  WHERE TupleLength < :length
)
SELECT Tuple
FROM Tuple
where TupleLength = :length /* between leftrange and rightrange  */ /* and not n table */
ORDER BY TupleLength desc,Tuple;

它仍然只是从列表中选择一个随机值。

谢谢Addell El-haddad。