2010-01-07 4 views
2

J'ai une table A avec une colonne pleine de phrases. J'ai une autre table B avec deux colonnes: mots et abréviations. Je veux regarder à travers les phrases de la colonne A de la table et si un mot de la colonne de mot du tableau B correspond alors le remplacer par l'abréviation.Remplacement SQL via la table

Espérons que c'est clair.

Cas n'a pas d'importance, je peux faire face à cela. Supposons que tout soit inférieur ou supérieur ou autre.

+0

Je ne pense pas qu'il soit possible de le faire avec pur SQL , quelle langue planifiez-vous pour nous e? Y a-t-il des problèmes de performance? Est-ce que ce sera fréquent? – Clash

+0

Je cherchais pur SQL (MySQL), pas de soucis de performance, pas fréquent. – Llynix

Répondre

1

Vous ne pouvez pas le faire avec SQL seul, vous devez extraire les données de la base de données, les manipuler et les repousser.

Il y a un tas de façons de le faire, certaines sont plus simples que d'autres et certaines sont plus efficaces.

Par exemple, une méthode simple mais lent serait (en pseudocode) ...

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 + ")") 

C'est fait une requête pour chaque mot de chaque phrase et non recommandé pour des performances des situations critiques, mais il fait le travail.

-1

Vous pourriez devenir fou et ajouter une connexion mysql odbc dans Excel. Interrogez les phrases dans une table de requête, interrogez les mots de recherche dans une autre table et écrivez une petite macro qui actualise les tables, puis effectue une recherche et un remplacement, puis les réimprime dans votre table. Je sais dans Ms sql, vous pouvez faire tout cela automatiquement dans DTS/SSIS.

0

Je sais qu'il est une vieille question, mais puisqu'il n'y a pas de réponse, je vais faire un essai avec ceci:

SQL Fiddle

MySQL 5.5.32 Configuration du schéma:

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

Demande:

SELECT * 
FROM Table1 

[Résultats]:

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

Recherche:

CALL updateSentences() 

SELECT * 
FROM Table1 

Results:

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