积极情景:
列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
来完成这项工作?
答案 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