我需要在postgresql中实现stringUtils Class indexOf()方法。
假设我有一个table
,其中url
就是其中一列。
url : "http://paypal-info.com/home.webapps.cgi-bin-limit/webscr.cmd-login-submit"
我的要求是找到' /'的第三次出现的索引。在上面的url和do substring中,只在paypal-info.com
Postgresql Query
主机名
任何实现这一点的想法都会感激不尽。 感谢
答案 0 :(得分:3)
string functions and operators section of the manual相当于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函数并将其作为扩展名公开。
答案 1 :(得分:1)
您是否尝试过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;
答案 2 :(得分:0)
只需用N替换3即可获得给定字符串中第N个'/'的索引
SELECT length(substring('http://asd/asd', '(([^/]*/){3})')) - 1
要从网址中提取主机名,您可以使用
SELECT substring('http://asd.com:234/qwe', 'http://([^:]+).*/')
在这里测试:SQLFiddle