MySQL поиск и удаление текста в поле - PullRequest
1 голос
/ 20 апреля 2019

Мне нужно обновить 2 поля в таблице, при условии, что у меня есть следующие данные:

Date          CategoryID
2019-04-19    1,92,10
2019-04-18    4,105,10
2019-04-17    3,106,7,78
2019-04-16    3,108,10

Я должен обновить CategoryID и удалить следующие номера категорий, если есть / находятся в строке: 106, 107, 108 и 92

Таким образом, результат будет:

Date          CategoryID
2019-04-19    1,10
2019-04-18    4,105,10
2019-04-17    3,7,78
2019-04-16    3,10

Обычно я использую функцию ЗАМЕНА, но в этом случае я не знаю, как использовать ее для удаления этой категории и сохранения других. Может ли кто-то водить меня? Спасибо, Лукас

РЕДАКТИРОВАТЬ: REGEXP_REPLACE от @Joakim Danielson сделал свое дело. Спасибо всем людям, которые участвуют / отвечают, однако, всем тем, кто критиковал, это не мой код, это блог Datalife Engine :)

Ответы [ 4 ]

2 голосов
/ 20 апреля 2019

Я использую REGEXP_REPLACE с двумя похожими шаблонами, но с запятой , до и после, чтобы поддерживать числа, являющиеся первыми, последними или где-то в. средний

UPDATE test
SET categoryID = REGEXP_REPLACE(categoryID, '((106|107|108|92)([,]{1}))|(([,]{1})(106|107|108|92))', '')

Этот запрос несколько ограничен, поскольку он заменит, например, 106 и 1060. Это проблема или идентификатор ограничен в диапазоне, так что это достаточно хорошо?


Поскольку я предполагаю, что это больше единовременная вещь, вы можете разделить ее на 3 разных обновления, чтобы убедиться, что вы получаете только точные попадания

-- id in the middle
UPDATE test 
SET categoryID = REGEXP_REPLACE(categoryID, ',(106|107|108|92),', ',')

-- id at the start
UPDATE test
SET categoryID = REGEXP_REPLACE(categoryID, '^(106|107|108|92),', '')

-- id at the end
UPDATE test
SET categoryID = REGEXP_REPLACE(categoryID, ',(106|107|108|92)$', '')
1 голос
/ 20 апреля 2019

Вы можете использовать несколько вызовов на замену, то есть сначала выполнять запросы для каждого номера с запятой после него. То есть это заменяет 107 пустой строкой.

Затем выполните запросы для каждого номера в виде одной записи. То есть замените 107 пустой строкой.

В обоих случаях следует помнить о частичных совпадениях. Поэтому, если вы замените 97 пустой строкой, это также изменит идентификатор 197 на 1. Или при замене 97 пустой строкой вы можете превратить 197,4 в 14.

0 голосов
/ 21 апреля 2019

REGEXP_REPLACE от @Joakim Danielson сделали свое дело. Спасибо всем людям, которые участвуют / отвечают, однако, всем тем, кто критиковал, это не мой код, это блог Datalife Engine :)

0 голосов
/ 20 апреля 2019

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

Однако, чтобы получить то, что вы просили, посмотрите, будет ли это работать:

UPDATE thetable
SET CategoryID = "1,10"
WHERE Date = "2019-04-19"

Чтобы это работало, SQL-запрос должен быть сгенерирован языком программирования, который проверяет строки и имеет какой-то другой способ выяснить, какую строку обновлять.

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