![](/img/trans.png)
[英]how to select a part of a text column as new column in mysql query
[英]Extract text from column in select of MySql query
我有一個名為sentEmails
的表,其中body
列包含電子郵件的正文。
在正文中,有一個子字符串,如:
some link: <a href="https://somelink@somesite.com/somePage.php?someVar=someVal&sentby=agent">Random link text
使用 MySql,我需要從這個列中提取 url,如https://somelink@somesite.com/somePage.php?someVar=someVal&sentby=agent
我在想像下面這樣的東西可以通過找到起始位置並返回接下來的 150 個字符來工作,當然它實際上只返回前 150 個字符。
SELECT LEFT(body, LOCATE('some link: <a href="', body)+150) AS link
FROM sentEmails
WHERE sent between date_sub(now(),INTERVAL 1 WEEK) and now()
AND body like '%some link:%'
AND toEmail = 'email@gmail.com'
附加信息:
some link:
之前some link:
Random link text
會改變https://somelink@somesite.com/somePage.php">Random link text
是可以接受的body
列的子字符串&sentby=agent
如果 URL 周圍有兩個唯一的分隔符,則可以使用SUBSTRING()
來隔離它。 一種方法是用分隔符替換錨標記中 URL 的兩側:
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(
REPLACE(REPLACE(body, '<a href="', '~'), '&sentby=agent">', '&sentby=agent~'), '~', -2),
'~', 1)
FROM sentEmails
WHERE sent BETWEEN DATE_SUB(NOW(), INTERVAL 1 WEEK) AND NOW() AND
body LIKE '%some link:%' AND
toEmail = 'email@gmail.com'
我用~
替換了<a href="
和">
。 如果~
沒有出現在body
列中的任何位置,並且body
只有一個 HTML 標記,那么這應該可以工作。
如果body
列只是一大塊 HTML,那么您應該考慮使用 xpath 並在您的應用程序層中處理它。
如果你只是想把鏈接提取出來,你能做 instr() 和 mid 函數嗎? 像這樣的東西
select mid(body,substr(body,'="'),substr(body,'">')-substr(body,'="')) from email...
substr(body,'="') = 鏈接的起始位置 =" 和 substr(body,'">') 是鏈接的結束位置。
MID 函數采用 (str,pos, len) 和 len = 結束位置 - 起始位置
感謝蒂姆的幫助,我能夠使用以下查詢來解決這個問題:
SELECT SUBSTRING_INDEX( SUBSTRING_INDEX(body, 'some link: <a href="', -1) , 'sentby=agent">', 1) AS link
FROM sentEmails
where sent between date_sub(now(),INTERVAL 1 WEEK) and now()
AND body like '%some link:%'
AND toEmail = 'email@gmail.com'
做這種搜索並不方便。 隨着包含電子郵件的表越來越大,查詢的性能會越來越低。
如果這是您正在構建的新應用程序,最好保留一個單獨的表,其中包含在每封發送的電子郵件中使用的 URL 列表。 您可以在發送電子郵件時將 URL 寫入數據庫。
這樣做的原因是該應用程序將在數據庫中進行比發送電子郵件更多的搜索。 因此,通過在發送電子郵件時做一些額外的工作,您可以在該功能最昂貴的用途(即搜索)方面提供很多幫助。
如果您仍然決定保留當前的方法,您將需要一個包含按此順序排列的列(toEmail、sent)的索引。
除此之外,你的方法是有道理的,並且會奏效。 你真的嘗試過嗎? 對你起作用嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.