2016-05-06 42 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

相关问题