在SQL Server ,採用1,2,4,8,16.....等用數位識別碼的狀態欄位可以進行累加,對存在的幾種狀態進行組合,從而可形成各種組合狀態
例如:一條記錄該欄位原來的數字是,2,如我們想加上4,則可以用
update t_User set iFlag = iFlag | 4 where UserID = 1
(iFlag 為該欄位名)
例2:在加上4之後我們想去掉4怎麼辦呢,可以這樣實現
update t_User set iFlag = iFlag ^4 where UserID = 1
這樣就又把4從該記錄中去掉了.
如果我們想選擇所有為2的記錄該怎麼做呢,可以這樣實現
select * from t_User where iFlag &2 = 2
SQL中的位元運算不但可以取出各種值,而且我們可以對他對資料進行排序
舉例如下,新聞列表中的一個欄位標識為
1:置頂
2:不置頂
4:推薦
8:不推薦
該欄位的值可以為這4種狀態的組合,如果我們根據一定條件想把所有置頂的放在前面該如何做呢
select * from t_News order by iFlag & 1 desc
這樣我們就把所有置頂的貼子排在前面,當然這裡可以加上一定的Where 條件,在Where 裡也可可以加一定的位元運算,
關於位元運算可以查閱相應的SQL 協助
下面來講一講C#中的枚舉位元運算
這裡我們定義一個枚舉
[Flags]
enum UserFlag
{
a = 1,
b = 2,
c = 4,
d = 8,
e = 16,
f = 32
}
在代碼裡加上如下處理
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string strSQL = "select * from v_User where iFlag & @iFlag = @iFlag";
//SqlParameter parm = new SqlParameter("@iFlag",SqlDbType.Int,4);
//parm.Value = UserFlag.a | UserFlag.b ;
SqlConnection con = new SqlConnection("server=.;database=Sinvan_TexDB;User Id=sa;pwd=123;");
SqlCommand comm = new SqlCommand(strSQL, con);
comm.Parameters.Add("@iFlag", SqlDbType.Int, 4).Value = UserFlag.a | UserFlag.b;
SqlDataAdapter adp = new SqlDataAdapter(comm);
DataTable dTable = new DataTable();
adp.Fill(dTable);
UserFlag userFlag = (UserFlag)Enum.Parse(typeof(UserFlag), dTable.Rows[0][11].ToString());
}
}
進行處理之後userFlag就是資料庫中存在的各種組合
我們同樣可對其進行一定的位元運算處理
如我們想加上 UserFlag.c 可進行如下操作
userFlag = userFlag | Userflag.c
如想去掉UserFlag.c 可進行如下操作
userFlag = userFlag ^ UserFlag.c
如我們要判斷是該標識中是否存在c可進行如下操作
(userFlag & UserFlag.c) == UserFlag.c
是不是與SQL Server 中的操作類似,位元運算不管什麼語言都是通用的,呵呵
可惜Access 不支援位元運算