Database PostgreSQL字符串字符替换

Database PostgreSQL字符串字符替换,database,regex,postgresql,Database,Regex,Postgresql,我正在尝试编写一个词汇数据库来存储由根和模式组成的单词,我想知道如何创建一个列来为我组合根和模式,同时忽略没有填充SELECT查询的两列的行 基本上,我有一个PostgreSQL数据库的输出: SELECT root, root_i FROM tbl_roots NATURAL JOIN tbl_patterns NATURAL JOIN tbl_patterns_triliteral; root | root_i ---------+-------- {s,ş,m} | 1u2u3

我正在尝试编写一个词汇数据库来存储由根和模式组成的单词,我想知道如何创建一个列来为我组合根和模式,同时忽略没有填充
SELECT
查询的两列的行

基本上,我有一个PostgreSQL数据库的输出:

SELECT root, root_i FROM tbl_roots NATURAL JOIN tbl_patterns NATURAL JOIN tbl_patterns_triliteral;

  root   | root_i
---------+--------
 {s,ş,m} | 1u2u3a
 {p,l,t} | 1u2u3a
 {t,m,s} | 1u2u3a
 {n,t,l} | 1u2u3a
 {s,ş,m} | 1a2oi3
 {p,l,t} | 1a2oi3
 {t,m,s} | 1a2oi3
 {n,t,l} | 1a2oi3
 {s,ş,m} | 1o2i3
 {p,l,t} | 1o2i3
 {t,m,s} | 1o2i3
 {n,t,l} | 1o2i3
 {s,ş,m} | a12e3
 {p,l,t} | a12e3
 {t,m,s} | a12e3
 {n,t,l} | a12e3
 {s,ş,m} | 1u2á3
 {p,l,t} | 1u2á3
 {t,m,s} | 1u2á3
 {n,t,l} | 1u2á3
 {s,ş,m} |
 {p,l,t} |
 {t,m,s} |
 {n,t,l} |
 {s,ş,m} | 1e2é3
 {p,l,t} | 1e2é3
 {t,m,s} | 1e2é3
 {n,t,l} | 1e2é3
 {s,ş,m} |
 {p,l,t} |
 {t,m,s} |
 {n,t,l} |
 {s,ş,m} |
 {p,l,t} |
 {t,m,s} |
 {n,t,l} |
 {s,ş,m} |
 {p,l,t} |
 {t,m,s} |
 {n,t,l} |
我想把它转换成类似这样的东西:

  root   | root_i | word_i
---------+--------+--------
 {s,ş,m} | 1u2u3a | suşuma
 {p,l,t} | 1u2u3a | puluta
 {t,m,s} | 1u2u3a | tumusa
 {n,t,l} | 1u2u3a | nutula
 {s,ş,m} | 1a2oi3 | saşoim
 {p,l,t} | 1a2oi3 | paloit
 {t,m,s} | 1a2oi3 | tamois
 {n,t,l} | 1a2oi3 | natoil
 {s,ş,m} | 1o2i3  | soşim
 {p,l,t} | 1o2i3  | polit
 {t,m,s} | 1o2i3  | tomis
 {n,t,l} | 1o2i3  | notil
 {s,ş,m} | a12e3  | asşem
 {p,l,t} | a12e3  | aplet
 {t,m,s} | a12e3  | atmes
 {n,t,l} | a12e3  | antel
 {s,ş,m} | 1u2á3  | suşám
 {p,l,t} | 1u2á3  | pulát
 {t,m,s} | 1u2á3  | tumás
 {n,t,l} | 1u2á3  | nutál
 {s,ş,m} | 1e2é3  | seşém
 {p,l,t} | 1e2é3  | pelét
 {t,m,s} | 1e2é3  | temés
 {n,t,l} | 1e2é3  | neşél
其中,
列是通过将
根_i
列中的数字替换为
列中该数字索引中的字符来动态生成的。我还需要删除两列中都没有条目的查询行,以减少输出中的混乱


有人能帮我设计一个postgres函数来合并字符[]和文本字符串吗?我需要的一点点正则表达式应该不复杂,但我不知道如何将其与查询混合,或者更好的是,将其转换为函数。

我必须承认,我不喜欢在sql/plpgsql函数中进行太多字符串操作。Perl有一个运算符,用于使用生成的替换替换替换regexp匹配项,这非常好:

create or replace function splice_to_word(root text, root_i text)
  returns text strict immutable language plperl as $$
  my $roots = shift;
  my $template = shift;
  $template =~ s{(\d+)}{substr($roots,$1-1,1)}ge;
  return $template;
$$;
postgresql数组似乎无法转换为Perl列表,因此我假设根作为字符串传入,例如:

select root, root_i, splice_to_word(array_to_string(root, ''), root_i) from data

我必须承认,我不喜欢在sql/plpgsql函数中进行太多的字符串操作。Perl有一个运算符,用于使用生成的替换替换替换regexp匹配项,这非常好:

create or replace function splice_to_word(root text, root_i text)
  returns text strict immutable language plperl as $$
  my $roots = shift;
  my $template = shift;
  $template =~ s{(\d+)}{substr($roots,$1-1,1)}ge;
  return $template;
$$;
postgresql数组似乎无法转换为Perl列表,因此我假设根作为字符串传入,例如:

select root, root_i, splice_to_word(array_to_string(root, ''), root_i) from data

我最初是将根存储在
1-2-3
格式的字符串中,数组在概念上更有意义;我还认为它可能会使选择单个字符变得更简单。我同意数组是比字符串更好的存储形式。遗憾的是,Perl集成似乎无法处理它(它接收数组的字符串表示作为参数)!我不得不将
\d+
更改为
\d
,因为需要维护序列,但这是一个开始。啊,好的观点。我假设你的数据意味着你的根数组中从来没有超过10个元素。是的,
root
长度在2到5个字符之间,但到目前为止我只为2到3个字符写过表。一旦我完成了整个工作,如果需要的话,插入一个额外的表就相对简单了;我还认为它可能会使选择单个字符变得更简单。我同意数组是比字符串更好的存储形式。遗憾的是,Perl集成似乎无法处理它(它接收数组的字符串表示作为参数)!我不得不将
\d+
更改为
\d
,因为需要维护序列,但这是一个开始。啊,好的观点。我假设你的数据意味着你的根数组中从来没有超过10个元素。是的,
root
长度在2到5个字符之间,但到目前为止我只为2到3个字符写过表。一旦我把这一切都准备好并开始工作,如果我需要的话,插入一个额外的表就相对简单了。酷。在这里我想它需要正则表达式。稍加微调,效果非常好,没有用户定义函数调用的开销。酷。在这里我想它需要正则表达式。稍加微调,效果非常好,无需用户定义函数调用的开销。