提问人:Lex_One 提问时间:4/22/2023 最后编辑:Lex_One 更新时间:4/23/2023 访问量:74
Postgre:从范围生成 uniq 随机字符串
Postgre: generate uniq random string from range
问:
我想从范围和表中尚不存在的文本值中生成一个随机文本值。
对于考试,我的范围从“abcdef”到“abcdej”。
我有一个 where id 必须是唯一的。tableA(id varchar(6), someData)
我想从列表('abcdef','abcdeg','abcdeh','abcdei','abcdej')等范围生成文本值 并检查它是否不在 tableA 中。
有什么办法可以做到吗?(最好不需要额外的程序)
更新:
- 生成的值应该成为新 ID
- 例如:范围从“FOOBARA”到“FOOBARZ”。tableA 中已经存在从 'FOOBARB' 到 'FOOBARV' 的值。结果必须从以下列表中随机选择:'FOOBARA'、'FOOBARW'、'FOOBARX'、'FOOBARY'、'FOOBARZ'。
- 在实践中,范围和字符串的长度将是 8 或 15 个字符,因此在长度上下文中不需要通用性。假定范围的边界指定正确且长度相同。
答:
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。
评论
id