postgresql Postgre:从range生成uniq随机字符串

cbwuti44  于 2023-04-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(131)

我想从一个范围中生成一个随机文本值,该值不存在于表中。
例如,我有从'abcdef'到'abcdej'的范围。
我有一个tableA(id varchar(6), someData),其中id必须是唯一的。
我想生成文本值从范围,如from list('abcdef ',' abcdeg ',' abcdeh ',' abcdei ',' abcdej '),并检查它是否不在tableA中。
有什么办法吗?(最好不需要额外的程序)
更新日期:
1.生成的值应该成为新的id
1.例如:范围是从'FOOBARA'到'FOOBARZ'。表A中已经存在从'FOOBARB'到'FOOBARV'的值。结果必须从列表中随机选择:'FOOBARA'、'FOOBARW'、'FOOBARX'、'FOOBARY'、'FOOBARZ'。
1.在实践中,范围,因此,字符串将是8或15个字符长,因此在长度上下文中不需要通用性。假设范围的边界被正确地指定并且具有相同的长度。

jv2fixgn

jv2fixgn1#

这是一个糟糕的解决方案,因为它将花费很长时间并消耗大量资源,但如果你有一个类似的问题,规模较小,这可能适合你:

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;

剩下的只是从列表中选择一个随机值。
谢谢阿德尔·艾尔·哈达德。

相关问题