1

postgres テーブルに次の形式のデータがあります。

 create table t (col1 character varying, col2 character varying, col3 character varying);

  col1   col2    col3
  <a>    <b>     <c> .
  <d>    owl:g   <h> .
  dbp:h1  <k>     <l> .

空白の出現をhttp://yago-knowledge.org/resource/VARIABLEに置き換える必要があり 、

  owl: <http://www.w3.org/2002/07/owl#VARIABLE>
  dbp: <http://dbpedia.org/ontology/VARIABLE>

re.sub(r"<(.*?)>", r"http://yago-knowledge.org/resource/\1", col) を使用してPythonで同じことを達成できることを私は知っています

変換されたデータは次のようになります。

<http://yago-knowledge.org/resource/a>    <http://yago-knowledge.org/resource/b>    <http://yago-knowledge.org/resource/c>
<http://yago-knowledge.org/resource/d>    <http://www.w3.org/2002/07/g>      <http://yago-knowledge.org/resource/h> 
<http://dbpedia.org/ontology/h1>          <http://yago-knowledge.org/resource/k>    <http://yago-knowledge.org/resource/l>

postgresでSQLを使用して同じことを達成することは可能ですか? また、col3 には各値の後にドットがありますが、SQL を使用してそのドットを削除することは可能ですか?

編集:正規表現を使用して次のことを試しました:

regexp_replace('<a>', '.[<a]a.', '<http://yago-knowledge.org/resource/')

しかし、うまくいかないようです。どこが間違っているのか、誰でも指摘できますか。

4

1 に答える 1

1

これを関数にパッケージ化する方がおそらく簡単でしょう。これで始められるはずです:

Create Function squirrel(col varchar) returns varchar as $$
begin
  col = regexp_replace(col, ' \.$', '');
  col = regexp_replace(col, '<(.)>', '<http://yago-knowledge.org/resource/\1>');
  col = regexp_replace(col, 'owl:(.*)', '<http://www.w3.org/2002/07/owl#\1>');
  col = regexp_replace(col, 'dbp:(.*)', '<http://dbpedia.org/ontology/#\1>');

  return col;
end;
$$ Language plpgsql;

Select 
  squirrel(col1) col1,
  squirrel(col2) col2,
  squirrel(col3) col3
from
  t

Example Fiddle

于 2013-10-11T20:34:49.840 に答える