mysql - вырезать первую строку в строке в зависимости от условия - PullRequest
0 голосов
/ 05 марта 2012

У меня новая проблема с запросом:

Я хочу обновить столбец 'column' в зависимости от идентификатора с некоторыми новыми данными:

UPDATE table SET column = CASE 
    WHEN id = 2 THEN CONCAT(`column`, ',7') 
    WHEN id = 3 THEN CONCAT(`column`, ',10')    
    ELSE column
    END;

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

id | column
-------------
 2 | 3, 1, 20
 3 | 1, 5

После выполнения запроса я получаю:

id | column
-------------
 2 | 3, 1, 20, 7
 3 | 1, 5, 10

Это все хорошо до сих пор.К сожалению, если я обновляю пустой столбец, все начинается с запятой и выглядит так:

id | column
-------------
 2 | ,7
 3 | ,10

Это вызывает некоторые проблемы при получении данных из db, потому что, когда я взрываю (), это делает первое значение массивапустой.Я хочу удалить такие первые запятые при обновлении таблицы.Я предполагаю, что должен сделать несколько операторов if, которые проверяют длину столбца (с char_length) и, если это пустое обновление без первого, начинаются с запятой.Можете ли вы помочь мне с правильным синтаксисом?

Описание: Как сделать правильный запрос, который обновляет столбец, как описано выше, со значениями, начинающимися с запятой, если существует «столбец».Если 'column' пусто, обновите его переменной без запятой.

Ответы [ 2 ]

2 голосов
/ 05 марта 2012

Правильный способ - не использовать CSV внутри ваших столбцов, используйте отдельную таблицу связей.Тогда вы просто ВСТАВИТЕ или УДАЛИТЕ ряды в своей таблице ассоциации, и у вас не возникнет никаких проблем.

Однако, если вам нужно придерживаться текущей схемы, вы можете сделать это:

update table
set column = case
    when id = 2 then concat(column, if(coalesce(column, '') = '',  '7',  ',7'))
    when id = 3 then concat(column, if(coalesce(column, '') = '', '10', ',10'))
    end
where id in (2, 3)

Если вы не включите coalesce, то у вас возникнут проблемы с NULL в column.

Также обратите внимание, что я отклонил вашу else в пользупредложения WHERE, не обновляйте больше, чем нужно.

1 голос
/ 05 марта 2012

Как насчет этого:

UPDATE table SET column = CASE 
    WHEN id = 2 THEN CONCAT(`column`, IF( CHAR_LENGTH(column)=0, '', ',' ), '7' ) 
    WHEN id = 3 THEN CONCAT(`column`, IF( CHAR_LENGTH(column)=0, '', ',' ), '10')    
    ELSE column
    END;

Справочное руководство по MySQL: CHAR_LENGTH (..) и IF (.., .., ..) .

...