Своп статуса MySQL для побитовых операторов - PullRequest
1 голос
/ 16 сентября 2009

Я ищу решение / лучшую практику для обмена значениями для флага состояния.

Состояние INT (3) в mysql имеет несколько значений, и я хотел бы иметь возможность поменять местами значения LIVE и NOT_LIVE, не прерывая остальные битовые значения.

Если это было поле флага, как в 0 или 1, это просто:

'status' NOT 'status'

Мне было интересно, есть ли способ сделать обмен, основанный на двух значениях (x, y) - без излишней логики кода, как в коде выше. Конечно, я могу мечтать, и мне просто нужно вернуться к запросу SELECT, и если оператор и ОБНОВЛЕНИЕ ...

есть идеи?

Ответы [ 3 ]

1 голос
/ 16 сентября 2009

так что ваши значения равны 1 и 2, но вы хотите перевернуть в битовом стиле? это не будет работать, потому что 1 и 2 имеют разные биты!

попробуйте это:

UPDATE table SET status = CASE status WHEN 1 THEN 2 ELSE 1 END
1 голос
/ 16 сентября 2009

Что именно вы подразумеваете под «поменять [ping] значения LIVE и NOT_LIVE»? Если LIVE это бит, который установлен / не установлен, то то, что вы ищете, это побитовое NAND. Например, если его значение равно 8 и вы хотите unset it

UPDATE table SET status = status &~ 8

Будет сброшен бит, значение которого равно 8. Если LIVE и NOT_LIVE - это два разных бита, то вам нужно установить один (ИЛИ) и сбросить другой (NAND). Здесь я уберу NOT_LIVE (4) при настройке LIVE (8)

UPDATE table SET status = (status &~ 4) | 8

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

UPDATE table SET status = (1 + 2) - status

который конечно можно написать

UPDATE table SET status = 3 - status

Обратите внимание, что произойдет сбой, если status примет любое другое значение. Вы можете избежать этого, изменив status, только если он один из двух.

UPDATE table SET status = 3 - status WHERE status IN (1, 2)

В этом случае, если status не равно LIVE или NOT_LIVE, оно не будет изменено.

0 голосов
/ 16 сентября 2009

Вам нужно регистр здесь:

UPDATE table SET status = CASE
    WHEN status = 1 THEN 2
    WHEN status = 2 THEN 3
    ELSE 1
END CASE

В качестве альтернативы, вы можете использовать if оператор , если вам нравится:

UPDATE table SET status =
    IF     status = 1 THEN 2
    ELSEIF status = 2 THEN 3
    ELSE   1
END IF
...