Scambio di stato MySQL per operatori bit a bit
Domanda
Sto cercando una soluzione / best practice per fare uno scambio di valori per un flag di stato.
Lo stato INT (3) in mysql ha alcuni valori e mi piacerebbe poter scambiare i valori LIVE e NOT_LIVE in giro, senza interrompere quali altri valori bit a bit ci sono.
Se fosse un campo flag, come in 0 o 1, è facile:
'status' NOT 'status'
Mi chiedevo se c'era un modo per fare uno scambio basato su due valori (x, y) - senza troppa logica del codice, come il codice sopra. Certo che sto sognando, e devo solo tornare a una query SELECT, e se istruzione e un AGGIORNAMENTO ...
qualche idea?
Soluzione
quindi i tuoi valori sono 1 e 2, ma vuoi capovolgere in stile bit? non funzionerà perché 1 e 2 hanno bit diversi impostati!
prova questo:
UPDATE table SET status = CASE status WHEN 1 THEN 2 ELSE 1 END
Altri suggerimenti
Cosa intendi esattamente per " swap [ping] i valori LIVE
e NOT_LIVE
" ? Se LIVE
è un po 'impostato / non impostato, quello che stai cercando è una NAND bit a bit. Ad esempio, se il suo valore è 8 e si desidera annullare l'impostazione
UPDATE table SET status = status &~ 8
Disattiverà il bit il cui valore è 8. Se LIVE
e NOT_LIVE
sono due bit diversi, sarà necessario impostare uno (OR) e deselezionare l'altro (NAND). Qui rimuoverò NOT_LIVE
(4) durante l'impostazione di LIVE
(8)
UPDATE table SET status = (status &~ 4) | 8
Se status
può avere solo due valori , ciò di cui hai bisogno è aggiungere quei due valori e sottrarre status
. Ad esempio, se i due valori sono 1 e 2
UPDATE table SET status = (1 + 2) - status
che ovviamente puoi scrivere
UPDATE table SET status = 3 - status
Nota che questo fallirà se status
assume qualsiasi altro valore. Puoi evitarlo cambiando status
solo se è uno dei due.
UPDATE table SET status = 3 - status WHERE status IN (1, 2)
In questo caso, se status
non è né LIVE
o NOT_LIVE
, non verrà modificato.
È necessario case case qui:
UPDATE table SET status = CASE
WHEN status = 1 THEN 2
WHEN status = 2 THEN 3
ELSE 1
END CASE
In alternativa, puoi utilizzare if statement , se ti piace:
UPDATE table SET status =
IF status = 1 THEN 2
ELSEIF status = 2 THEN 3
ELSE 1
END IF