Замена строковых символов в PostgreSQL - PullRequest
0 голосов
/ 11 февраля 2011

Я пытаюсь написать лексическую базу данных для хранения слов, состоящих из корней и шаблонов, и мне было интересно, как я могу создать столбец, который будет объединять для меня корень и шаблон, игнорируя при этом строки, которые не имеют столбцы заполненного запроса 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

Где столбец word генерируется динамически путем замены цифр в столбце root_i на символ в индексе этой цифры в столбце root. Мне также нужно отбросить запрошенные строки, которые не имеют записи в обоих столбцах, чтобы уменьшить беспорядок в моих выходных данных.

Может кто-нибудь помочь мне разработать функцию postgres, которая будет выполнять слияние символов [] и текстовых строк? Немного нужного нам регулярного выражения не должно быть сложным, но я понятия не имею, как смешать это с запросом или, что еще лучше, превратить его в функцию.

Ответы [ 2 ]

3 голосов
/ 11 февраля 2011
select
  root,
  root_i,
  translate(root_i, "123", array_to_string(root,'')) as word_i
NATURAL JOIN tbl_patterns
NATURAL JOIN tbl_patterns_triliteral
where root is not null and root_i is not null;
1 голос
/ 11 февраля 2011

Я должен признать, что не любил много манипулировать строками в функциях sql / plpgsql. В Perl есть оператор для замены совпадений регулярных выражений на сгенерированные замены, который работает довольно хорошо:

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, поэтому я предположил, что корни передаются в виде строки, например ::1004

select root, root_i, splice_to_word(array_to_string(root, ''), root_i) from data
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...