2010-01-07 76 views
2

我有一个表A与一列充满句子。通过表的SQL替换

我有另一张表B与两列:单词和缩写。

我想查看表A的列句,并且如果表B的单词列匹配的单词匹配,则用缩写替换它。

希望是明确的。

案件无所谓,我可以处理。假设一切都较低或较高或任何。

+0

我不认为这是可能的纯SQL来做到这一点,你打算使用哪种语言è?是否有任何性能问题?这会频繁吗? – Clash 2010-01-07 23:14:08

+0

我正在寻找纯粹的SQL(MySQL),没有性能问题,不经常。 – Llynix 2010-01-08 20:28:36

回答

1

你不能单独使用SQL来完成这个工作,你需要从数据库中提取数据,操纵它,然后再推回去。

有很多方法可以做到这一点,有些更简单,其他人更有效。

例如一个简单的,但缓慢的方法是(以伪)...

sentence_list = db.execute("SELECT id, sentence FROM A") 
for sentence in sentence_list do 
    words = tokenize(sentence.text) 

    for word in words do 
     abbrev = db.execute("SELECT abbrev FROM B WHERE word=word") 
     if abbrev 
      word = abbrev 

    sentence.text = concat(words) 
    db.execute("UPDATE A SET sentence=" + sentence.text + " WHERE id = " + sentence.id + ")") 

那才做的每一个字的查询中的每一句话,不推荐对性能至关重要的情况,但它的工作。

-1

你可能会疯了,并在Excel中添加一个MySQL odbc连接。查询一个查询表中的句子,查询另一个表中的查询词,然后编写一个刷新表的小宏,然后执行查找和替换操作,然后将其重新导入到表中。我知道在Ms sql中,您可以在DTS/SSIS中自动执行所有这些操作。

0

我知道这是一个老问题,但由于没有答案,我给这个一试:

SQL Fiddle

MySQL的32年5月5日架构设置

CREATE TABLE Table1 
    (`Id` int, `Sentence` varchar(80)) 
; 

INSERT INTO Table1 
    (`Id`, `Sentence`) 
VALUES 
    (1, 'Mister John is going to Los Angeles') 
; 

CREATE TABLE Table2 
    (`Id` int, `Word` varchar(60), `Abbrev` varchar(10)) 
; 

INSERT INTO Table2 
    (`Id`, `Word`, `Abbrev`) 
VALUES 
    (1, 'Mister', 'Mr.'), 
    (2, 'Los Angeles', 'L.A.') 
; 


DROP PROCEDURE IF EXISTS updateSentences // 

CREATE PROCEDURE updateSentences() 
BEGIN 

    DECLARE count INT; 

    SELECT COUNT(*) INTO count 
    FROM Table1 
    INNER JOIN Table2 ON CONCAT(' ',Sentence,' ') LIKE CONCAT('%',Word,'%'); 

    WHILE count > 0 DO 
    UPDATE Table1 
    INNER JOIN (SELECT t1.id, Word,Abbrev 
      FROM Table1 t1 
      INNER JOIN Table2 ON CONCAT(' ',Sentence,' ') LIKE CONCAT('%',Word,'%') 
      LIMIT 1) Table2 ON Table1.Id = Table2.Id 
    SET Sentence = REPLACE(Sentence,Word,Abbrev); 
    SELECT COUNT(*) INTO count 
    FROM Table1 
    INNER JOIN Table2 ON CONCAT(' ',Sentence,' ') LIKE CONCAT('%',Word,'%'); 
    END WHILE; 
END// 

查询

SELECT * 
FROM Table1 

结果

| ID |       SENTENCE | 
|----|-------------------------------------| 
| 1 | Mister John is going to Los Angeles | 

查询

CALL updateSentences() 

SELECT * 
FROM Table1 

Results

| ID |     SENTENCE | 
|----|---------------------------| 
| 1 | Mr. John is going to L.A. |