Как выборочно удалить определенное значение из столбца, который содержит более одного значения, каждое из которых разделено запятой, с помощью SQL? - PullRequest
0 голосов
/ 11 ноября 2018

например, рассмотрим таблицу, как показано ниже (table name=accounts)

account        owner_ids
PA account     sa123,rt458,hf678,de348f
RA account     gg678n,fk980,rt458,hf678

Здесь я хочу удалить owner_ids "rt458" and "hf678" из всей таблицы, и после удаления запятых должно быть идеально (я имею в виду, что после удаления также оставшиеся owner_ids должны быть разделены запятой, как и раньше, и не должно быть лишних запятых в колонка)

Любая помощь приветствуется, помогите мне, ребята

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018
UPDATE accounts
SET owner_ids = TRIM(BOTH ',' FROM
    REPLACE(REPLACE(CONCAT(',', owner_ids, ','), ',rt458,', ''), ',hf678,', '')
);

Сначала добавьте поле и добавьте запятую CONCAT(',', owner_ids, ','), чтобы сделать его равномерным.

Затем удалите из него ,rt458, и ,hf678,.

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

Это будет поддерживать одинарные запятые между значениями.

Обратите внимание, что вы должны предпочесть нормализацию owner_ids, чтобы с такими обновлениями было легко работать.

0 голосов
/ 11 ноября 2018

Вы можете использовать функцию REPLACE дважды:

update accounts 
set owner_ids = REPLACE(REPLACE(owner_ids,
             ',rt458' ),',hf678');

REPLACE возвращает char при каждом замене search_string на replace_string.

Или вы можете использовать REGEXP_REPLACE , чтобы заменить / удалить эти значения регулярным выражением:

update accounts 
set owner_ids = REGEXP_REPLACE(owner_ids,
             '(\,rt458||\,hf678)', '');

REGEXP_REPLACE расширяет функциональность функции REPLACE, позволяя вам искать в строке шаблон регулярного выражения.

Для поддержки случая, когда rt458 является первой записью в списке CSV (как прокомментировал @TimBiegeleisen), вы должны разрешить использовать запятую как:

update accounts 
set owner_ids = REGEXP_REPLACE(owner_ids,
             '(\,{0,1}rt458||\,{0,1}hf678)', '');

Используя замену, вам нужно будет удвоить количество звонков:

update accounts 
set owner_ids = REPLACE(REPLACE(REPLACE(REPLACE(owner_ids,
             ',rt458' ),',hf678', 'rt458,', 'hf678,');

Также вы можете увидеть другие решения для удаления значения из строки через запятую

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