2010-03-28 3 views
1

У меня есть таблица posts с колонкой published, которая либо 0 (неопубликованная), либо 1 (опубликовано). Скажите, что я хочу опубликовать все опубликованные сообщения в неопубликованные сообщения и все неопубликованные сообщения в опубликованные сообщения. Я знаю, что работаетСвертывание значений столбца в командной строке mysql

UPDATE posts SET published = '1' WHERE published = '0'; 
UPDATE posts SET published = '0' WHERE published = '1'; 

будет в конечном итоге превращая все мои посты в опубликованных сообщений. Как запустить эти запросы в командной строке mysql, чтобы они действительно «отменили» значения, а не ошибку, описанную выше?

Благодаря

EDIT: считать данные типы являются строками. Я знаю, что ints/bools - намного лучший способ сделать это, но я работаю со строками, и изменение схемы не является вариантом.

ответ

2

Использование:

UPDATE posts 
    SET published = CASE 
        WHEN published IS NULL THEN NULL 
        WHEN published = '1' THEN '0' 
        ELSE '1' 
        END 
+0

Корпус - хорошее общее решение; моя работала только с целыми числами 0 и 1 – MarkR

+0

Это сделало именно то, что мне было нужно. Спасибо! – user94154

2

Если это кажется очень трудным, вы об этом недостаточно думали.

UPDATE posts SET published = 1 - published; 

Должно это сделать или какие-либо другие решения (например, с использованием XOR или CASE).

+0

Что делать, если я работаю со строками и не INTS/Bools? Это не фактическая схема, которую я использую, я изменил ее, чтобы защитить невинных. Я должен был использовать строки в моем вопросе, но концепция остается прежней: изменение столбца A до значения столбца B и наоборот, не превращая все в значение одного столбца. – user94154

+0

CASE, вероятно, является самым общим решением. Я думаю, что изменение A на B и B на A - это другая проблема, которую я не сразу знаю, ответ (без назначения временной переменной). Я не совсем уверен в порядке оценки в операциях UPDATE mysql, но у меня есть ощущение, что после того, как вы установили столбец, использование его в выражении позже в том же заявлении для обновления использует новое значение, а не старое. – MarkR

2

Для строк - вы можете использовать любое выражение в предложении SET.

UPDATE posts SET published = IF(published = "1", "0", "1"); 

CASE версия, благодаря OMG Ponies:

UPDATE posts SET published = CASE published WHEN "1" THEN "0" ELSE "1" END; 

В обеих версиях, если они опубликованы IS NULL, он будет установлен в "1", как ни в какое сравнение с NULL является ложным.

+0

+1: Действительно, но я рекомендую использовать CASE, потому что он ANSI стандартный и переносимый для большинства других баз данных. –

+0

Похоже, что CASE является наиболее полезным. Не могли бы вы объяснить, что функция IF(). Порядок аргументов мне пока не имеет смысла. – user94154

+0

@ user94154: Первый аргумент - это утверждение для оценки. Второй - это значение, возвращаемое, если оператор является истинным, а третий - если утверждение ложно. –

0

Что вы, ребята, думаете об этом:

UPDATE posts SET published = 'A1' WHERE published = 'A'; 
UPDATE posts SET published = 'B' WHERE published = 'A'; 
UPDATE posts SET published = 'A' WHERE published = 'A1'; 

EDIT: это отдаленно не правильно

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