5

我需要在 postgresql 中实现 stringUtils Class indexOf() 方法。

可以说我有一个列table在其中url之一。

url : "http://paypal-info.com/home.webapps.cgi-bin-limit/webscr.cmd-login-submit"

我的要求是在上面的 url 中找到第 3 次出现的 '/' 的索引,然后做子字符串,只取paypal-info.com 主机名Postgresql Query

任何关于实施这一点的想法将不胜感激。谢谢

4

3 回答 3

4

您是否尝试过 split_part 方法?

SELECT split_part('http://paypal-info.com/home.webapps.cgi-bin-limit/webscr.cmd-login-submit', '/', 3)

结果:

split_part
paypal-info.com

对于其他字符串函数,试试这个文档: http ://www.postgresql.org/docs/9.1/static/functions-string.html

编辑:至于 indexOf 本身,我不知道任何内置的 postgres 解决方案。但是使用两个字符串函数可以这样实现:

SELECT strpos('http://paypal-info.com/home.webapps.cgi-bin-limit/webscr.cmd-login-submit', split_part('http://paypal-info.com/home.webapps.cgi-bin-limit/webscr.cmd-login-submit', '/', 4)) - 1 as index_of;
于 2014-08-22T08:18:56.390 回答
4

手册的字符串函数和运算符部分相当于String.indexOf,例如

select position('/' in 'http://paypal-info.com/home.webapps.cgi-bin-limit/webscr.cmd-login-submit');

但是它不提供获得第 n 次出现的选项。

你真的接近这一切都是错误的。您应该使用正确的 URL 解析代码来提取主机部分,而不是尝试自己滚动或使用正则表达式/拆分/字符串修饰。

PostgreSQL 没有原生的 URL/URI 类型,但它的过程语言有,而且包装合适的函数很简单。例如使用 PL/Python:

create language plpythonu;
create or replace function urlhost(url text) returns text 
language plpythonu 
immutable strict
as $$
import urlparse
return urlparse.urlparse(url).netloc
$$;

然后:

regress=# select urlhost('http://paypal-info.com/home.webapps.cgi-bin-limit/webscr.cmd-login-submit');
     urlhost     
-----------------
 paypal-info.com
(1 row)

如果您更喜欢使用 PL/Perl、PL/V8 或其他什么,那很好。

为了获得最佳性能,您可以编写一个简单的 C 函数并将其公开为扩展。

于 2014-08-22T13:57:11.307 回答
1

只需将 3 替换为 N 即可获得给定字符串中第 N 个“/”的索引

SELECT length(substring('http://asd/asd', '(([^/]*/){3})')) - 1

要从 url 中提取主机名,您可以使用

SELECT substring('http://asd.com:234/qwe', 'http://([^:]+).*/')

在这里测试:SQLFiddle

于 2014-08-22T10:30:34.237 回答