Postgresql 你能在Postgres中重新排列字符串吗?

Postgresql 你能在Postgres中重新排列字符串吗?,postgresql,Postgresql,我正在寻找一种在Postgres中重新排列字符串的方法。我需要使一个字符串不可识别,但它也需要是可逆的,所以散列函数和随机生成的任何东西都是不可识别的。此外,我正在处理10个字符长的字符串,因此我希望将结果重新排列的字符串保持在相同的范围内。这不是一个安全的字符串,这只是为了保持某种形式的东西可以立即识别 我想创造一些类似于 Select rearrange('12345abcde'); 这将产生像这样的东西 '1a2b3c4d5e' 重新排列功能不需要完全相同,如果我被指向正确的方向,我可

我正在寻找一种在Postgres中重新排列字符串的方法。我需要使一个字符串不可识别,但它也需要是可逆的,所以散列函数和随机生成的任何东西都是不可识别的。此外,我正在处理10个字符长的字符串,因此我希望将结果重新排列的字符串保持在相同的范围内。这不是一个安全的字符串,这只是为了保持某种形式的东西可以立即识别

我想创造一些类似于

Select rearrange('12345abcde');
这将产生像这样的东西

'1a2b3c4d5e'
重新排列功能不需要完全相同,如果我被指向正确的方向,我可以根据我的具体需要调整一个功能,但长度可能会有所不同,因为我需要能够反转过程,所以需要使用非随机方法来完成。

函数示例:

create or replace function rearrange(str text, n int)
returns text language sql immutable as $$
    select string_agg(item, '' order by (ord- 1) % n, ord)
    from regexp_split_to_table(str, '') with ordinality as a(item, ord)
$$;

select rearrange('12345abcde', 5);

 rearrange  
------------
 1a2b3c4d5e
(1 row)
使用2作为第二个参数,可以反转十个字符字符串的转换:

select rearrange(rearrange('12345abcde', 5), 2);

 rearrange  
------------
 12345abcde
(1 row) 

是的,你可以在postgres中重新排列字符串!到目前为止,你尝试了什么?我没有指定我的postgres版本,但它似乎在9.3中不存在。我仍然在考虑这个问题,但是有没有一种方法可以在不使用常规性的情况下产生相同的结果呢?虽然存在替代方案,但它们的优雅程度要低得多
ordinality
(和
jsonb
)值得升级,无论如何9.3已经不受支持了。