2016-05-06 52 views
6

我有這個表:如何爲BIT(...)數據類型列使用substr(...)?

// numbers 
+---------+------------+ 
| id | numb | 
+---------+------------+ 
| int(11) | bit(10) | 
+---------+------------+ 
| 1  | 1001100111 | 
| 2  | 0111000101 | 
| 3  | 0001101010 | 
| 4  | 1111111011 | 
+---------+------------+ 

現在,我試圖讓第三位從這些數字(從左至右)。例如:

1001100111 
^// I want to get 0 

因此預期結果:

+--------------------+ 
| substr(numb, 3, 1) | 
+--------------------+ 
| 0     | 
| 1     | 
| 0     | 
| 1     | 
+--------------------+ 

這裏是我的查詢:

SELECT SUBSTR(numb, 3, 1) FROM numbers 

但它不工作。因爲bit(10)不是字符串,SUBSTR()不能解析它。有什麼解決方法嗎?

+0

首先將其轉換爲字符串... – HoneyBadger

+0

可以從右側找到第8位數字嗎? – dasblinkenlight

+0

@dasblinkenlight是的。 – stack

回答

2

雖然你可以轉換爲varchar,爲BIT(...)數據類型爲使用位運營商更簡單的方法使用後substr

因爲根據您的評論它是確定從右側提取8個比特,而不是從左邊第三位,這將產生預期的結果:

select id, (x>>7)&1 
from test 

Demo.

是否可以更新其中一位數字?我的意思是我想從1001011101更新第七位數字(從右到左)並將其設爲0

您可以設置一個有點像這樣零:

UPDATE test SET x = x & b'1110111111' WHERE id=3 

的0位置表示要設置爲零位。

如果你想將它設置爲1,使用

UPDATE test SET x = x | b'0001000000' WHERE id=3 

你可以有一個以上的零在第一個例子,如果你想多個位設置爲零。同樣,如果需要將多個位設置爲1,則可以在第二個示例中包含多個1

+0

非常好..謝謝.. upvote – stack

+0

可以請你告訴我什麼是'&1'?其實這部分查詢對我來說真的很難'(x >> 8)&1' – stack

+0

@stack我編輯了答案,它應該是一個由7而不是8的移位。'>> 7'的意思是「移位到正確的七點「。它下降最多七位。 '&1'是一個掩蔽操作。它意味着「按位和1」,或者簡單地說「取最小有效位」。總體而言,表達意味着「放棄最後七位,並保持下一個位」。 – dasblinkenlight

3

你可以轉換BITVARCHARCHAR),然後使用SUBSTR在以下幾點:

SELECT SUBSTR(CONVERT(VARCHAR(10),numb), 3, 1) 
FROM numbers 

或者使用LEFTRIGHT

SELECT LEFT(RIGHT(CONVERT(VARCHAR(10),numb),8),1) 
FROM numbers 
2

如果你有一點列,然後使用位操作。

這些記錄在here

一種方法是:

select ((numb & b'0010000000') > 0) 
+0

**第三位**在哪裏?而且你缺少一個''' – stack

+0

@stack。 。 。 「1」在第三位。 –

+0

我明白了。謝謝.. upvote – stack

相關問題