2012-07-24 196 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