2013-06-30 28 views
2

我有一個第三方組件存儲url的表,我想從這個url只獲得id參數。用正則表達式選擇字段的一部分

在PHP中我能做到這一點是這樣的:

$subject = "index.php?option=com_content&catid=2&id=456&view=article"; //mysql query result 
$pattern = '*[&?]id=([0-9]+)*'; //matches either ?id=456 or &id=456 
preg_match($pattern, $subject, $matches); 
echo $matches[1];//prints 456 

匹配的將是一個新的查詢的一部分數量:

SELECT name FROM table1 WHERE id=the_match 

現在,我認爲這將是快了很多做它直接通過mysql的,像

SELECT name FROM table1 WHERE id = (SELECT REGEX_MATCH('*[&?]id=([0-9]+)*', '$1') FROM table2 WHERE uniquefield1 = 'fred') 

顯然SELECT REGEX_MATCH('*[&?]id=([0-9]+)*', '$1') FROM table2 WHERE uniquefield1 = 'fred')完全發明,菊st說,我想選擇第一組匹配正則表達式,並使用它來使WHERE條款工作。

是否可以用MySQL來做這樣的事情?

回答

4

不,可悲的是,MySQL沒有辦法將SELECT語句應用於SELECT子句中的列內容,只有WHERE子句。

但您可以使用普通(非正則表達式)字符串操作函數來執行此操作。如果包含您的&符號分隔的參數字符串的列名爲url,則可以使用此罰款字符串表達式獲取ID號,該號碼可找到您的ID號。

CAST(RIGHT(url, LENGTH(url) - 3 - LOCATE('&id=', url)) AS SIGNED INTEGER) 

所以,如果你想從table1urlid值的列表,你可以使用這個SELECT查詢。

SELECT CAST(RIGHT(url, LENGTH(url) - 3 - 
         LOCATE('&id=', url)) AS SIGNED INTEGER) AS id 
    FROM table1 
WHERE url REGEXP '&id=[0-9]+' 

正如你所看到的,這使用正則表達式搜索功能來找到合適的行。

沒有什麼快速的。正則表達式匹配不能利用MySQL索引。如果您可以選擇使用預先提取的id列加載表格,那麼當您的表格變大時,您會更好地搜索。

+0

那麼,這也可以是有用的,你可以發佈一個在'WHERE'子句中使用正則表達式的例子嗎? – BackSlash

+0

請參閱我的編輯 –

+0

我的專欄名爲'origurl',所以我試過這個'SELECT CAST(RIGHT(origurl,LENGTH(origurl) - 3 - LOCATE('&id =',origurl))AS INTEGER)id id FROM j_sefurls WHERE origurl REGEXP'&id = [0-9] +'',它表示_#1064 - 您的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在''AS id FROM j_sefurls WHERE origurl REGEXP'&id = [0-9] +'LIMIT 0,30'在行1_ – BackSlash

1

可以使用這個包:mysql-udf-regexp

這個包實現的功能有:

REGEXP_LIKE(text, pattern [, mode]) 
REGEXP_SUBSTR(text, pattern [,position [,occurence [,mode]]]) 
REGEXP_INSTR?(text, pattern [,position [,occurence [,return_end [,mode]]]]) 
REGEXP_REPLACE?(text, pattern, replace [,position [,occurence [,return_end [,mode]]]) 

非常相似的Oracle SQL函數。

+1

不幸的是,我仍然無法做到這一點,因爲我在共享的網絡服務器上,我無法安裝php或mysql插件。不過很高興知道它存在。 – BackSlash

相關問題