2012-07-24 138 views
1

如何提取/.html之间的数字值?如何从字符串中获取部分字符串

http://www.site.com/prod/bunch-of-seo-text-of-different-length/12345687.html 
http://www.site.com/prod/bunch-of-seo-text-of-different-length/12345688.html 
http://www.site.com/prod/bunch-of-seo-text-of-different-length/12345688.html 

我想这一点,但我不知道有关语法

SUBSTRING(link FROM '%/%' FOR '%.html%') 

回答

1

我不是一个PostgreSQL的家伙,但它看起来像它有一些内置的正则表达式的功能。请参阅PostgreSQL Matching Functions并找到它描述regexp_matches函数的部分。 regexp_matches返回数组({})。

SELECT regexp_matches(link, '([0-9]+)\.html$'); 

unnest看到PostgreSQL Arrays结合这一点:

SELECT unnest(SELECT regexp_matches(link, '([0-9]+)\.html$')) as matches; 
+0

它给了我很奇怪的结果,我不知道如何去除'{'和'} – Andrew 2012-07-24 21:33:18

+0

@Andrew,我不知道我的编辑是否可以工作,因为我只有SQL经验和不PostgreSQL的,但这个想法是regexp_matches返回一个数组,你需要再访问该阵列,或将其转化为表行,我试图把它变成表行。 – zamnuts 2012-07-24 21:47:32

+0

无需UNNEST:'选择(regexp_matches(联系, '[0-9] +'))[1] 从网址;' – 2012-07-24 21:51:44

0

这个片段会给你任何URL的文件名:

SELECT REVERSE(SUBSTRING(REVERSE(REPLACE('http://www.somewhere.com/folder/page.html', '\', '/')), 1, CHARINDEX('/', REVERSE(REPLACE('http://www.somewhere.com/folder/page.html', '\', '/'))) - 1)) as PageName 

输出:

page.htm升

或者,如果你在传递URL作为一个nvarchar变量:

SELECT REVERSE(SUBSTRING(REVERSE(REPLACE(@Url, '\', '/')), 1, CHARINDEX('/', REVERSE(REPLACE(@Url, '\', '/'))) - 1)) as PageName 
0

另一种选择是使用字符串函数:

select substring(link from '[0-9]+') 
from your_table; 

这假设是,这正是一个 “号”网址。

2

的问题是:

我怎样可以提取之间的数值/和HTML吗?

和适当的答案是:

SELECT substring(link, '/(\d+)\.html') 

\d ..类简写[[:digit:]]这相当于[0-9]
+ ..一个或多个前述原子
() ..圆括号捕获匹配
\. .. dot必须逃脱以松脱其特殊含义

测试:

WITH x(link) AS (
    VALUES 
    ('http://www.site.com/prod/bunch-of-text-of-different-length/12345687.html') 
    ,('http://www.site.com/prod/bunch-of-text/12345688.html') 
    ,('http://www.site2.com/prod/123/text-of-di456fferent-89-len/12345688.html') 
    ) 
SELECT substring(link, '/(\d+)\.html') FROM x; 

regexp_matches()是为捕获多个比赛和不是一个很好的选择。

+0

Brandstetter修改,我不知道,子可以采取正则表达式。我同意,你的回答更适合这个问题。 – zamnuts 2012-07-31 19:17:48

相关问题