StringUtil indexOf()等效于postgreSQL查询

时间:2014-08-22 08:16:24

标签: java postgresql indexof string-utils

我需要在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主机名

任何实现这一点的想法都会感激不尽。 感谢

3 个答案:

答案 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