Mam nowy problem z zapytaniem:

Chcę zaktualizować kolumnę „kolumna” w zależności od identyfikatora o nowe dane:

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

Niestety, dodawanie nowych wartości do kolumny musi mieć na początku przecinek, ponieważ kolumna przechowuje dane jako wartości oddzielone przecinkami. Na przykład wygląda to tak:

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

Po wykonaniu zapytania otrzymuję:

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

Do tej pory wszystko jest w porządku. Niestety, jeśli zaktualizuję kolumnę, która jest pusta, wszystko zaczyna się od przecinka i wygląda to tak:

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

Powoduje to pewne problemy podczas pobierania danych z bazy danych, ponieważ kiedy je rozbijam, powoduje to, że pierwsza wartość tablicy jest pusta. Chcę usunąć takie pierwsze przecinki podczas aktualizacji tabeli. Myślę, że powinienem zrobić kilka instrukcji 'if', które sprawdzają długość 'kolumny' (z char_length) i czy jest to pusta aktualizacja bez uprzedniego przecinka. Czy możesz mi pomóc z prawidłową składnią?

Podsumowanie: Jak zrobić poprawne zapytanie aktualizujące kolumnę jak opisano powyżej wartościami zaczynającymi się od przecinka, jeśli 'kolumna' istnieje. Jeśli 'kolumna' jest pusta, zaktualizuj ją zmienną bez początkowego przecinka.

0
Kalreg 5 marzec 2012, 02:11

2 odpowiedzi

Najlepsza odpowiedź

Co powiesz na to:

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;

Podręcznik MySQL: CHAR_LENGTH(..) i < a href="http://dev.mysql.com/doc/refman/5.1/de/control-flow-functions.html" rel="nofollow">JEŻELI(..,..,..).

1
SteAp 5 marzec 2012, 02:16

Właściwym sposobem jest nie używanie CSV w swoich kolumnach, użyj osobnej tabeli asocjacyjnej. Wtedy wystarczy INSERT lub DELETE wiersze w tabeli asocjacyjnej i nie będzie żadnych problemów.

Jeśli jednak musisz trzymać się obecnego schematu, możesz to zrobić:

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)

Jeśli nie uwzględnisz coalesce< /a> wtedy napotkasz problemy z wartościami NULL w column.

Pamiętaj też, że zrezygnowałem z Twojego else na rzecz klauzuli WHERE, nie aktualizuj więcej niż potrzebujesz.

2
mu is too short 5 marzec 2012, 02:24