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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top