【问题标题】:SQL Replacement via table通过表进行 SQL 替换
【发布时间】:2011-01-02 16:14:15
【问题描述】:

我有一张表A,其中有一列全是句子。

我还有另一个表 B,其中包含两列:单词和缩写。

我想查看表A的列句子,如果表B的单词列中的单词匹配,则将其替换为缩写。

希望这很清楚。

大小写无关紧要,我可以处理。假设一切都较低或较高或其他。

【问题讨论】:

  • 我认为用纯 SQL 不可能做到这一点,您打算使用哪种语言?有任何性能问题吗?这会经常发生吗?
  • 我一直在寻找纯 SQL(MySQL),没有性能问题,不频繁。

标签: mysql sql text replace


【解决方案1】:

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

SQL Fiddle

MySQL 5.5.32 架构设置

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. |

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您不能单独使用 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 + ")")
      

      这是对每个句子中的每个单词进行查询,不建议在性能关键的情况下使用,但确实可以。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-02
        • 2017-02-23
        • 1970-01-01
        • 2011-11-30
        • 2011-03-03
        • 1970-01-01
        • 2018-01-17
        • 1970-01-01
        相关资源
        最近更新 更多