bnghtz

Flag rendszer SQL-ben

Nov 21st, 2013
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.45 KB | None | 0 0
  1. English version: http://pastebin.com/8JuW6Fzw
  2.  
  3. MySQL le tudja kezelni a hexa számokat. Tehát 0x0020 == 32 == b0100000;
  4. Azért tároljuk hexában a flageket, mert úgy könnnyebb beírni és átlátni őket. Valójában ezek bináris számok.
  5.  
  6. Elmélet:
  7. ^^^^^^^
  8.  
  9. Unió képzés: |
  10. 0100 (4)
  11. 0010 (2)
  12. -----------
  13. | 0110 (6)
  14.  
  15. Metszet képzés: &
  16. 0110 (6)
  17. 0010 (2)
  18. -----------
  19. & 0010 (2)
  20.  
  21. Kivonás = negálttal való metszet képzés
  22. 0110 (6)
  23. 0010 (2)
  24. .........
  25. 0110 (6)
  26. 1101 (~2)
  27. -----------
  28. &~0100 (4)
  29.  
  30.  
  31.  
  32. Számolási példák:
  33. ^^^^^^^^^^^^^^^^
  34.  
  35. Lekérdezés:
  36. SELECT 33 & 0x0020; # be van allitva? -> Igen 32
  37. SELECT 12 & 0x0020; # be van allitva? -> Nem 0
  38.  
  39. Beállítás:
  40. SELECT (33 | 0x0020); # -> 33
  41. SELECT (10 | 0x0020); # -> 42
  42.  
  43. Törlés:
  44. SELECT (33 & ~ 0x0020); # -> 1
  45.  
  46. Toggle:
  47. SELECT (33 ^ 0x0020); # -> 1
  48. SELECT ((33 ^ 0x0020) ^ 0x0020); # -> 33
  49.  
  50.  
  51.  
  52. Adatbázis példák:
  53. ^^^^^^^^^^^^^^^^
  54.  
  55. [ Lekérdezés ]
  56. Ahol be van állítva:
  57. SELECT * FROM table WHERE flags & 0x0020 = 0x0020 ; # ez szép
  58. SELECT * FROM table WHERE (flags & 0x0020); # ez egyszerű
  59.  
  60. Ahol nincs beállítva:
  61. SELECT * FROM table WHERE flags & 0x0020 = 0; # ez szép
  62. SELECT * FROM table WHERE !(flags & 0x0020); # ez egyszerű
  63.  
  64. [ Beállítás ]
  65. UPDATE table SET flags = flags | 0x0020;
  66.  
  67. [ Törlés ]
  68. UPDATE table SET flags = flags & ~0x0020;
  69.  
  70. [ Toggle (átkapcsolás) ]
  71. UPDATE table SET flags = flags ^ 0x0020;
  72.  
  73.  
  74.  
  75. [ Több flag egyszerre történő lekérdezése ]
  76. Kérdezzük le a usereket privilégiumaik szerint, ahol:
  77. PRIV_ADMIN = 0x001;
  78. PRIV_LEARNER = 0x008;
  79.  
  80. A user admin és learner egyszerre:
  81. SELECT * FROM users WHERE priv & (8 | 1) = (8 | 1);
  82.  
  83. A user learner vagy admin (vagy mindkettő):
  84. SELECT * FROM users WHERE priv & (8 | 1) > 0
  85. SELECT * FROM users WHERE (priv & (8 | 1));
  86.  
  87. A user sem nem learner, sem nem admin:
  88. SELECT * FROM users WHERE priv & (8 | 1) = 0;
  89. SELECT * FROM users WHERE !(priv & (8 | 1));
  90.  
  91. [ Több flag egyszerre történő beállítása ]
  92. Legyen learner és admin is!
  93. UPDATE users SET priv = priv | (8 | 1);
  94.  
  95. [ Több flag egyszerre történő törlése ]
  96. Ne legyen se admin, se learner!
  97. UPDATE users SET priv = priv & ~(8 | 1);
  98.  
  99. [ Beállítás és törlés egyszerre ]
  100. Legyen admin, de ne legyen learner!
  101. UPDATE users SET priv = (priv | 1) & ~8;
  102. UPDATE users SET priv = (priv & ~8) | 1;
Advertisement
Add Comment
Please, Sign In to add comment