2012-04-23 72 views
4

考慮鳴叫大衆替換字符串在MySQL

id tweet 
------------------------------------------------------ 
1 alcoa inc stock analysis 
2 bullrider has added alcoa inc to portfolio 
3 caterpillar annual results 
4 more at http://bit.ly/d3423 on caterpillar 
5 making apple inc profits 

的下表我想與指定的標籤,以取代公司名稱,具體如下:

id tweet 
------------------------------------------------------ 
1 {COMPANY|AA} stock analysis 
2 bullrider has added {COMPANY|AA} to portfolio 
3 {COMPANY|CAT} annual results 
4 more at http://bit.ly/d3423 on {COMPANY|CAT} 
5 making {COMPANY|AAPL} profits 

現在我有以下查詢:

UPDATE 
    tweets 
SET 
    tweet = REPLACE(tweet, 'alcoa inc', '{COMPANY|AA}') 
WHERE 
    tweet LIKE '% alcoa inc %' 
OR 
    tweet LIKE 'alcoa inc %' 
OR 
    tweet LIKE '% alcoa inc' 

我有兩個問題,雖然:

  1. 沒有更好的方法來捕捉所有可能的「alcoa inc」實例嗎?
  2. 是否有可能在SQL中編寫一個用於多個替換的數組(在SQL中,而不是在PHP中)。這裏。我的意思是在SQL中定義類似於array("alcoa inc" => "{COMPANY|AA}", "caterpillar" => "{COMPANY|CAT}", "apple inc" => "{COMPANY{AAPL}")的東西,並在SQL中循環以進行批量替換。

您的幫助表示讚賞:-)

+0

你爲什麼不只是使用'鳴叫LIKE「% alcoa inc%''? – Lamak 2012-04-23 19:29:38

+4

我猜想它是不匹配的,例如'balcoa inc'。 – mellamokb 2012-04-23 19:30:33

+0

究竟是什麼mellamokb說 – Pr0no 2012-04-23 19:31:07

回答

3

你可以嘗試在表中存儲行情和公司的名單,並使用這樣的查詢:

select 
    case 
     when c.ticker is not null then 
      replace(t.tweet, c.name, 
        concat('{COMPANY|',c.ticker,'}')) 
     else t.tweet 
    end as tweet 
from 
    tweets t 
left join 
    company c 
     on 
      t.tweet like concat('% ', c.name, ' %') 
     or 
      t.tweet like concat(c.name, ' %') 
     or 
      t.tweet like concat('% ', c.name) 
group by 
    t.id 

唯一的缺點是該解決方案不會處理兩個公司的名字出現在同一條推文中的情況。其中只有一個將被替換。

演示:http://www.sqlfiddle.com/#!2/8da9d/2


編輯:由於@Mario指出,這是可能的匹配會導致不正確的更換是否有相同的字符串的多個實例。例如,使用帶有替換apple的字符串I have a redapple from apple將導致字符串I have a red{COMPANY|AAPL} from {COMPANY|AAPL},因爲第二個apple觸發LIKE匹配,則REPLACE將替換每個匹配。我有一個通過讀取匹配的字符串了一個表,以及處理這種情況,以及更新的查詢:

select 
    case 
     when p.ticker is not null then 
      replace(t.tweet, 
       replace(p.replacestr, '{0}', p.name), 
       replace(p.replacestr, '{0}', concat('{COMPANY|',p.ticker,'}'))) 
     else t.tweet 
    end as tweet 
from 
    tweets t 
left join 
    (select * from pattern,company) p 
     on t.tweet like replace(p.pattern, '{0}', p.name); 
group by 
    t.id 

哪裏Pattern是這樣定義的表:

CREATE TABLE Pattern 
    (pattern varchar(50), replacestr varchar(50)); 

INSERT INTO Pattern 
    (pattern, replacestr) 
VALUES 
    ('% {0} %', ' {0} '), 
    ('{0} %', '{0} '), 
    ('% {0}', ' {0}'); 

演示:http://www.sqlfiddle.com/#!2/c71d4/3

+0

但據我所知,這可以通過運行查詢兩次解決,不是嗎? – Pr0no 2012-04-23 20:32:42

+0

從技術上講,這將解決它。 – mellamokb 2012-04-23 21:28:31

1

沒有更好的方法來捕捉所有可能的「alcoa inc」實例嗎?

REGEX(Reqular Expression)搜索。請查看官方mysql REGEX文檔瞭解更多信息。

是否有可能在SQL中爲多個 替換(在SQL中,因此不在PHP中)編寫一個數組的排序。這裏。我的意思是在SQL中定義 ,如array(「alcoa inc」=>「{COMPANY | AA}」, 「caterpillar」=>「{COMPANY | CAT}」,「apple inc」=>「{COMPANY {AAPL} 「)和 在SQL中循環遍歷以進行批量替換。

是的,你可以創建一個特定的表來存儲鍵 - >值字典,然後從中獲得價值,所以FO例如:

table : dictionary 
+----------+-----------------------+---------------+ 
| name  | pattern    | replacement | 
+----------+-----------------------+---------------+ 
|alcoa inc | [[:space:]]+alcoa inc |{COMPANY|AA} | 
|apple inc | apple inc.*   |{COMPANY{AAPL} | 

你還可以用像下面的查詢更新,例如:

UPDATE tweets SET tweets = REPLACE(tweet, 'alcoa inc', '{COMPANY|AA}') 
WHERE tweet RLIKE (SELECT pattern FROM dictionary WHERE name = 'alcoa inc'); 

這只是爲了說明一個可能的方法的例子,你必須調整它爲您的要求和具體環境。這樣做的

0

一種方法是用存儲過程:

CREATE PROCEDURE UpdateTweetsWithCompany 
    @CompanyName varchar(255) = 'alcoa inc', 
    @ReplaceValue varchar(255) = '{COMPANY|AA}' 
AS 
BEGIN 
    UPDATE 
     tweets 
    SET 
     tweet = REPLACE(tweet, @CompanyName, @ReplaceValue) 
    WHERE 
     tweet LIKE '% ' + @CompanyName + ' %' 
    OR 
     tweet LIKE @CompanyName + ' %' 
    OR 
     tweet LIKE '% ' + @CompanyName 
END 

然後調用它,有點像這樣:

EXEC UpdateTweetsWithCompany 'alcoa inc', '{COMPANY|AA}' 
+0

儘管如此,'REPLACE'仍然會將「balcoa inc''這樣的字符串替換爲」{b | COMPANY | AA}「。 – 2012-04-23 19:47:58

+0

它不應該是因爲'WHERE..LIKE'中提供的過濾器# – mellamokb 2012-04-24 12:10:30

+2

@mellamokb'tweet'可能是''我有一個來自蘋果的紅蘋果''並且'REPLACE'會改變所有的事件。 E,g:如果我們將「apple」改爲「{COMPANY | AA}」,則結果爲:''我有{COMPANY | AA}「的紅色{COMPANY | AA}。儘管WHERE條款會找到「apple」。 – 2012-04-24 12:17:55