將不確(que)定變為確(que)定~SQLSERVER是(shi)否可(ke)以進行位運算?
有(you)(you)時,我(wo)們(men)在設(she)計表結構(gou)時,有(you)(you)的(de)(de)(de)字段可能同時具有(you)(you)幾種狀態(tai),如小微自己的(de)(de)(de)文(wen)件屬性(xing)也是屬于這種情況(kuang)的(de)(de)(de),“只讀,歸檔,隱藏”,但你(ni)對一(yi)個文(wen)件設(she)置屬性(xing)時,事實上(shang)是可以將這三個屬性(xing)同時賦(fu)予一(yi)個對象的(de)(de)(de),這對于我(wo)們(men)來(lai)說是正常的(de)(de)(de),那程序(xu)內(nei)部(bu)是怎么實現的(de)(de)(de)呢?
首先(xian)一個枚舉,SQL里可能是(shi)一張表,也可能是(shi)事先(xian)規定好(hao)的幾個值,如: 只讀1,歸檔2,隱藏3
再沒有(you)看.net源代碼時,我認為可能是這樣存(cun)儲的
文件屬性為只讀+歸檔,值為:1,2
我們看到它是用,分(fen)開的,然后(hou)再(zai)分(fen)別去求和就可以(yi)了
但(dan)當我看了(le)(le).net源代碼后,我的作法有(you)了(le)(le)一個變(bian)化,那就是(shi)利用位(wei)移(yi)運算(suan),應該(gai)說從性能到程序(xu)清晰(xi)度(du)上(shang)有(you)一個飛(fei)躍
文件屬性為只讀+歸檔,值為:3 (3=1+2)
當然我們需要在數據庫中查詢出包含歸檔(2)的屬性的記錄時,如何去實現呢
其實(shi),SQL與C#里(li)的位移運(yun)算符號是(shi)完全相(xiang)同的,它有以(yi)下幾種情況
1 update User_Info set Status = Status | 8 where UserID = 1 --更(geng)新user_info里(li)的(de)status字段,在原(yuan)有(you)基礎上增加8 2 3 update User_Info set Status = Status & (~8) where UserID = 1 --更(geng)新(xin)user_info里(li)的status字段,在原(yuan)有(you)基礎上減去8,如果(guo)原(yuan)來(lai)的值中不包含8,那會在原(yuan)來(lai)的值上加(jia)上8 4 5 select * from User where Status & 8 >0 --找到(dao)所到(dao)包括(kuo)8的記(ji)錄
呵呵,怎么樣(yang),挺(ting)方便(bian)吧(ba),這只(zhi)是表面的,事(shi)實上,它在查(cha)詢上性能也(ye)遠遠高于(yu)第一種(zhong)拼(pin)接字符的方法(fa)。