2012-03-04 3 views
0

У меня есть новая проблема с запросом:MySQL - вырезать первую строку в строке в зависимости от состояния

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

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

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

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

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

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

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

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

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

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

ответ

1

Как об этом:

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(..,..,..).

+0

отлично работает, спасибо. – Kalreg

+0

Добро пожаловать! Счастливое кодирование! – SteAp

2

Правильный способ состоит в том, чтобы не использовать 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, не обновляйте больше, чем вам нужно.

+0

спасибо, я стараюсь об этом обойтись об ассоциативных таблицах. и я оставил, как вы предложили – Kalreg

Смежные вопросы