用于替换的SQL命令?

时间:2013-10-11 19:49:40

标签: sql regex postgresql

我的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“&lt;(。*?)&gt;”,r“http://yago-knowledge.org/resource/\1”在python中实现相同的效果, COL)

我转换的数据如下所示:

<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/')

然而,它似乎不起作用。任何人都可以指出我哪里出错了。

1 个答案:

答案 0 :(得分: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