Замена SQL через таблицу - PullRequest
       31

Замена SQL через таблицу

2 голосов
/ 07 января 2010

У меня есть таблица A с колонкой, полной предложений.

У меня есть еще одна таблица B с двумя столбцами: слова и сокращения.

Я хочу просмотреть предложения столбцов таблицы A, и, если слово из столбца слов таблицы B соответствует, заменить его сокращением.

Надеюсь, это ясно.

Дело не имеет значения, я могу с этим справиться. Предположим, что все ниже или выше или как угодно.

Ответы [ 3 ]

1 голос
/ 08 января 2010

Вы не можете сделать это только с помощью 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 + ")")

Это делает запрос для каждого слова в каждом предложении и не рекомендуется для критических ситуаций производительности, но это делает работу.

0 голосов
/ 15 декабря 2014

Я знаю, что это старый вопрос, но так как ответа нет, я попробую с этим:

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

Результаты

| ID |                  SENTENCE |
|----|---------------------------|
|  1 | Mr. John is going to L.A. |
0 голосов
/ 08 января 2010

Вы можете сойти с ума и добавить соединение mysql odbc в excel. Запросите предложения в одной таблице запросов, запросите слова поиска в другой таблице и напишите небольшой макрос, который обновляет таблицы, затем выполняет поиск и замену, а затем повторно импортирует их обратно в вашу таблицу. Я знаю в MS SQL, вы можете сделать все это автоматически в DTS / SSIS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...