已知以下數據:MySQL的 - 查詢整數按位場分爲布爾列的每一位
mysql> select * from test2;
+-------+--------+
| name | status |
+-------+--------+
| bob | 0 |
| jim | 2 |
| karen | 5 |
| jane | 1 |
| roy | 7 |
+-------+--------+
我要拿出一個查詢將拆分出來的狀態列的值轉換爲整數的每個單獨位的僞布爾值列。
我現在要做的是讓應用程序生成使用case語句和位和運營商爲每一列得到的結果,像這樣的查詢:
mysql> select
-> name,
-> (case when (status & 1) then 'yes' else 'no' end) as bit1,
-> (case when (status & 2) then 'yes' else 'no' end) as bit2,
-> (case when (status & 4) then 'yes' else 'no' end) as bit4,
-> (case when (status & 8) then 'yes' else 'no' end) as bit8
-> from test2;
+-------+------+------+------+------+
| name | bit1 | bit2 | bit4 | bit8 |
+-------+------+------+------+------+
| bob | no | no | no | no |
| jim | no | yes | no | no |
| karen | yes | no | yes | no |
| jane | yes | no | no | no |
| roy | yes | yes | yes | no |
+-------+------+------+------+------+
5 rows in set (0.00 sec)
現在這個工作的,這樣做因爲沒有子查詢或聯接,所以效率不高,但它不是很優雅。
我想要一個更優雅的解決方案來動態執行此操作,而不必創建case語句並測試每一位。
這是隻有幾位數據的示例數據,但在實現中,將會有數萬行,並且可以設置更多的位。
加成:
基地產生的列(列名稱和測試)關閉含有每個位的定義如下所示的表中的:
mysql> select * from bit_spec;
+-----+------+
| bit | desc |
+-----+------+
| 1 | bit1 |
| 2 | bit2 |
| 4 | bit3 |
| 8 | bit4 |
+-----+------+
目前,應用程序處理這並不是一個強硬的要求,而是由MySQL服務器來完成這個處理,但如果是這樣的話,這將是有利的。
這裏是SQL Fiddle包含示例數據,示例位定義表和我當前的解決方案。
它主要用於報告的目的,將會有一些針對它的測試,但是有一些有趣的方法可以解決MySQL中按位字段的效率問題[1],所以我並不完全擔心關於它。你的答案看起來不錯,我很可能會在做一些測試後接受它。 [1] http://explainextended.com/2009/10/01/bitwise-operations-and-indexes/ –