如何在Postgres中提取未定义的字符串长度

时间:2014-04-12 07:12:41

标签: postgresql substring undefined string-length

我是sql的新手,我想从以下字符串中提取'SWAMP RIVER NEAR DOVER PLAINS NY':

<a href='http://waterdata.usgs.gov/nwis/nwisman/?site_no=01199490'>01199490</a> SWAMP RIVER NEAR DOVER PLAINS NY</a>

问题是我想要提取的范围长度在每一行都有所不同。

我尝试了以下内容:

select substring (name, 80 , char_length(name) - 4 ) from stream_gages; 

但我明白了:SWAMP RIVER NEAR DOVER PLAINS NY</a>无论我在减号后面加了多少数字。

我有办法做到这一点吗?

因此,我正在尝试做的是将每个流量计站的代码和名称提取到新列中,包含在:

<a href='http://waterdata.usgs.gov/nwis/nwisman/?site_no=01199490'>01199490</a> SWAMP RIVER NEAR DOVER PLAINS NY</a>

为了做一些GIS查询。

代码是从位置57开始的编号,以及从位置80开始的名称(在代码长度不变的情况下,这是大多数情况)但是名称的长度在每行中变化。代码的长度也会有几行变化,但是我可以手动编辑它,如果难以想出那样做的sql。但是,对于所有240行中的名称,长度是不同的。感谢。

1 个答案:

答案 0 :(得分:0)

您可以使用 regexp_replace() ,避免文字常量:

create TABLE bla
        ( id SERIAL NOT NULL PRIMARY KEY
        , body varchar
        );

select * from bla;

INSERT INTO bla(body) VALUES
(e'<a href=\'http://waterdata.usgs.gov/nwis/nwisman/?site_no=01199490\'>01199490</a> SWAMP RIVER NEAR DOVER PLAINS NY</a>' )
        ;

select id
  , regexp_replace(body, e'.+<\/a> ([^<]+)<\/a>.*', '\1')
from bla;

结果:

CREATE TABLE
 id | body 
----+------
(0 rows)

INSERT 0 1
 id |          regexp_replace          
----+----------------------------------
  1 | SWAMP RIVER NEAR DOVER PLAINS NY
(1 row)