我正在尝试针对类型为SET的列运行SQL SELECT语句。该表名为myTable
,myTable
中的列称为base_props
和names
。 base_props
列的类型为SET。 base_prop
中的值为vb
,nt
,cnt
,poss
和loc
。所以我想从“名称”列中选择条目,其中base_props
包含值vb
和poss
。我希望得到的结果可能只有vb
和poss
以外的值。所以要明确我想要选择具有值vb
和poss
的所有条目,无论它们是否还有其他值。我尝试了以下SQL查询,但无法获得所需的结果。
SELECT name from myTable WHERE base_props = 'vb' AND base_props = 'poss'
该查询返回一个空结果集。我尝试过使用FIND_IN_SET()
和IN()
,但我无法使用它。我之前编写过SQL语句,但从不必处理类型为SET的列。任何帮助表示赞赏。
答案 0 :(得分:1)
我唯一能想到的就是使用LIKE关键字:
SELECT name FROM myTable WHERE (base_props LIKE '%vb%' AND base_props LIKE '%poss%');
这将确保vb和cnt都在base_props列中。当然你可以在那里使用cnt,nt和loc,或者在sql中使用任意数量的base_props值,只需添加更多AND
语句。
或者作为samitha指出的删除答案,你可以使用FIND_IN_SET:
SELECT name from myTable WHERE FIND_IN_SET('vb', base_props) AND FIND_IN_SET('poss', base_props);
评论(由 spencer7593 ):“这两项工作都有效,但有一点点差别.LIKE运算符实际上会匹配任何包含搜索字符串的成员在一个术语中; FIND_IN_SET函数只匹配一个确切的成员。它也可以使用MySQL BITAND运算符按照它们在SET定义中出现的顺序搜索集合中的成员:例如,匹配第一个和第四个成员集合:WHERE base_props& 1 AND base_props& 8“。例如,如果您的集合中有'a'和'aaa',那么使用LIKE "%a%"
方法也会返回包含'aaa'的行。
结论:使用FIND_IN_SET
解决方案,因为它适用于所有情况。
答案 1 :(得分:0)
FIND_IN_SET返回索引,试试这个
SELECT name from myTable WHERE FIND_IN_SET(base_props, 'vb') > 0 AND
FIND_IN_SET(base_props, 'poss') > 0