我有一个包含52个boolean
字段的表。它们是每条记录的特定标志。
为了使索引编制更快/更容易,以及能够将这些标志unique
组合在一起,我插入了一个名为 flags 的新列,如下所示:
ALTER TABLE myTable ADD COLUMN flags BIT(52);
现在,我可以使用以下符号将值手动插入该列:
INSERT INTO myTable (flags) values (b'0011000101');
但是,我希望能够从我已经填充的布尔字段中已经存在的数据中的所有记录中更新字段 flags 。像这样:
UPDATE myTable SET flags = CONCAT(myBoolean1, myBoolean2, myBoolean3, ... myBoolean52);
这当然是行不通的,因为CONCAT
函数会生成一个1和0的 varchar(52)。
我一直尝试在CAST
和CONV
上使用不同的参数,但没有成功。而且,我看不出有一种明显的方法可以使表达式中的b'00101011'
而不是带引号的一和零。
我该如何从一个表达式中填充一个BIT
类型的字段,该表达式可以从其他booland字段中构建位?
答案 0 :(得分:0)
您可以使用try CONV函数(我尚未尝试使用BIT类型):
UPDATE
myTable
SET
flags = 0 + CONV(CONCAT(myBoolean1, myBoolean2, myBoolean3, ... myBoolean52), 2, 10)
;
OR
UPDATE
myTable
SET
flags = CAST(CONV(CONCAT(myBoolean1, myBoolean2, myBoolean3, ... myBoolean52), 2, 10) AS UNSIGNED)
;
说明:
CONCAT
-将您的1/0值转换为二进制字符串('1','1','0'=>'110')
CONV
-将二进制字符串转换为dec字符串('110'=>'6')
CAST
或0 +
-将dec字符串转换为int('6'=> 6)
不过,我担心的是:
使索引编制更快/更容易
人们通常使用位掩码按精确位进行过滤。 不幸的是,MySQL在这种情况下将不使用索引。