Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 如何在Postgres中提取字符串的未定义长度_Postgresql_Substring_Undefined_String Length - Fatal编程技术网

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

Postgresql 如何在Postgres中提取字符串的未定义长度,postgresql,substring,undefined,string-length,Postgresql,Substring,Undefined,String Length,我是sql的新手,我想从以下字符串中提取“纽约多佛平原附近的沼泽河”: <a href='http://waterdata.usgs.gov/nwis/nwisman/?site_no=01199490'>01199490</a> SWAMP RIVER NEAR DOVER PLAINS NY</a> 但是我得到:纽约多佛平原附近的沼泽河不管我在减号后面加了多少数字 我有办法做到这一点吗 因此,我正试图做的是将每个测流站的代码和名称提取到新列中,包含在:

我是sql的新手,我想从以下字符串中提取“纽约多佛平原附近的沼泽河”:

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

你可以用 ,避免使用文字常量:

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;

第三个参数是要提取的子字符串的长度,而不是结束位置是否确实不想使用外部HTML解析器?如果要提取的范围的
长度在每一行中不同,显然需要指定其变化方式。请提供示例或更多解释。感谢您的澄清@ClodoaldoNeto我对JS和SQL是如此陌生,以至于我不确定什么是HTML解析器。所以,是的。长度根据站点名称的长度而不同,但我知道每个站点名称从第80位开始,在第一个字符“谢谢你的回答”之前结束一个位置。它适用于这一行,但并不适用于所有站点:“>多佛平原附近的沼泽河”>盖洛德斯维尔附近的十英里河”“>纽约黑麦的盲溪”>马马龙的海狸沼泽溪”>佩勒姆·尼韦尔的哈钦森河,我只能回答被问到的问题,不是吗?如果您有不同的行,其中有不同的模式,可能可以使用另一个regexp。(或者可能是一个完全不同的解决方案)当然,你提出的解决方案解决了原始问题中的问题。直到后来我意识到我的问题不清楚,我才编辑了我的问题。非常感谢您的回答和时间。我正在努力弄明白这一点。再一次谢谢你。嗨,这里再一次说,实际上提出的解决方案是有效的。我只是在输入代码时犯了一个愚蠢的小错误。如果您不介意,请解释一下为什么您输入了参数,以便我可以将其应用于其他情况吗?我不能(也不应该)在一个回答或评论中向您解释regexp。阅读有关它们的内容(可能在我链接的手册中)。基本上,这个特定的regexp由三部分组成:您想要的东西
([^
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)