我是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行中的名称,长度是不同的。感谢。
答案 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)