Заменить в MySQL: различные значения из таблицы должны быть заменены на «XXX» - PullRequest
1 голос
/ 07 июня 2019

Я хочу заменить множество строк на «XXX». Строки для замены находятся в специальной таблице. Например в таблице есть «Мистер Смит», «Мистер Миллер», ... (сотни записей), а в одном поле в другой таблице - e. г. «Дорогой мистер Смит, спасибо за ...». В результате это должно быть "Уважаемый XXX, спасибо за ...". Как это сделать?

Единственная идея, которая у меня была, заключалась в том, чтобы создать цикл в PHP и сделать это как Cronjob. Но есть ли способ сделать это чисто с помощью оператора SQL?

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Используя ту же настройку таблицы, которая была дана в ответе Клаудио Корчеса, вот как это сделать без подзапроса:

UPDATE `Template` AS t, 
    `Customer` AS c
SET t.`Description` = REPLACE(t.`Description`, c.`Name`, 'XXX')
WHERE t.`Description` LIKE CONCAT('%', c.`Name`, '%')
;

IMO, это выглядит немного чище, но ответ с подзапросом тоже работает просто отлично.

Если вам понравилось это, отметьте как принятый ответ, спасибо.

Наслаждайтесь.

0 голосов
/ 07 июня 2019

Если у вас есть что-то похожее на эти таблицы:

CREATE TABLE Customer(
                CustomerID SMALLSERIAL PRIMARY KEY,             
                Name VARCHAR(256) NOT NULL);    

INSERT INTO Customer(Name) VALUES('Mr. Miller');
INSERT INTO Customer(Name) VALUES('Mr. Smith');     
INSERT INTO Customer(Name) VALUES('Mr. John');
INSERT INTO Customer(Name) VALUES('Mr. Alex');


Create table Template(
                TemplateID SMALLSERIAL PRIMARY KEY,
                Description VARCHAR(256) NOT NULL);

INSERT INTO Template(Description) VALUES('Dear Mr. Smith, thank you for');
INSERT INTO Template(Description) VALUES('Dear Mr. John, thank you for');       
INSERT INTO Template(Description) VALUES('Dear Mr. Alex, thank you for');

Вы можете использовать что-то вроде этого.

SELECT customer.Name, template.description, REPLACE(template.description, customer.Name, 'XXX') 
FROM Customer INNER JOIN Template ON template.description LIKE CONCAT('%', Customer.name, '%');

И результат будет:

And the result would be:

Запрос на обновление будет выглядеть примерно так:

WITH subquery AS (
    SELECT customer.Name, template.description, REPLACE(template.description, customer.Name, 'XXX') 
    FROM Customer INNER JOIN Template ON template.description LIKE CONCAT('%', Customer.name, '%')
)
UPDATE template
SET description = subquery.replace
FROM subquery;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...