FIND_IN_SET无法处理BIT类型列

时间:2017-02-22 13:48:39

标签: mysql

积极情景:categories的类型为String

例如:

+--------------------------+
|user |categories          |
+--------------------------+
|1    |executive,contractor|
+--------------------------+
|2    |executive           |
+--------------------------+
|3    |client              |
+--------------------------+

以下是查询:

select * from myTable where FIND_IN_SET('executive',`categories`);

以上查询将返回前两行,因为两个用户都是执行。

负面情景:

isExecutable的类型为BIT

以下是查询:

select * from myTable where FIND_IN_SET(1,`isExecutable`)

上面的查询返回0条记录虽然1列中有isExecutable的记录。我也有不同的列,我每次创建动态查询。所以FIND_IN_SET足以满足所有除了这种情况以外的要求。有没有办法只使用FIND_IN_SET来完成这项工作?

1 个答案:

答案 0 :(得分:1)

正如find_in_set()上的MySQL文档所述,它适用于字符串,而不适用于bit数据类型。这就是它失败的原因。

因此,您需要将isExecutable字段转换为以逗号分隔的1和0列表到单个字符串中,这就是export_set()函数的设计目标:

select * from myTable where FIND_IN_SET('1',export_set(`isExecutable`,'1','0',',')

但是,您不需要此字符串转换,因为如果任何位设置为1,则其值大于0.

select * from myTable where isExecutable > 0b0

select * from myTable where isExecutable + 0 > 0

更新

在对该问题的后续评论中,OP表示该字段用于标记真或假(0或1)。因此,使用export_set - find_in_set的意义更小。只需检查数字0或1:

 select * from myTable where isExecutable + 0 = 1