Bitsel operatörler için MySQL durum takas

3 Cevap php

Ben bir durum bayrak değerlerinin bir takas yapmak için bir çözüm / en iyi uygulama için arıyorum.

Mysql durumu INT (3) birkaç değerleri vardır, ve diğer bit değerleri orada ne kesmeden, etrafında LIVE ve NOT_LIVE değerlerini takas edebilmek istiyorum.

Bu 0 veya 1 olarak bir bayrak alan olsaydı, bu kolaydır:

'status' NOT 'status'

Çok fazla kod mantığı olmadan, yukarıdaki kodu gibi - Ben iki değerleri (x, y) dayalı bir takas yapabileceği bir yolu olup olmadığını merak ediyordum. Tabii ki hayal olabilir, ve sadece bir SELECT sorgusu dönmek zorunda ve deyim ve bir update eğer ...

herhangi bir fikir?

3 Cevap

böylece değerleri 1 ve 2, ama biraz tarzı saygısız istiyorsun? 1 ve 2 farklı bit set var, çünkü bu işe yaramayacak!

Bu deneyin:

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

Tam olarak ne demek istiyorsun "takas [Ping] LIVE ve NOT_LIVE değerler"? LIVE / unset ayarlanmış biraz varsa o zaman ne arıyorsun bir bit NAND olduğunu. Örneğin, değeri 8 ve sizin için unset istersen

UPDATE table SET status = status &~ 8

Bu., Değeri 8 bit unset olursa LIVE ve NOT_LIVE, iki farklı bit o zaman bir (OR) set ve unset diğer (NAND) gerekir vardır. İşte kaldırmak NOT_LIVE (4) kurarken LIVE (8) olacak

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

status olabilir only have two values o zaman ne gerek bu iki değerler eklemek ise substract status. Örneğin, eğer bu iki değer 1 ve 2

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

bu tabii ki yazabilirsiniz

UPDATE table SET status = 3 - status

status başka bir değer alırsa, bu başarısız olacağını unutmayın. Bunu iki biri ise sadece status değiştirerek önleyebilirsiniz.

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

status ne LIVE veya NOT_LIVE ise, bu durumda, bu değişmiş olmayacak.

Sen case statement burada gerekir:

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

İsterseniz Alternatif olarak, if statement kullanabilirsiniz:

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