我想反转此查询:
SELECT * FROM table WHERE status IN ( option,option1,option2 );
在 等查询中
字段'status'列包含(例如):'option,option1'。 当我使用 它还会选择“status”列中仅包含“option1” 这可能吗? 示例数据: 此查询应选择选择记录1,2和5. 'status'字段类型为varchar。 问题是状态字段包含几乎相似的数据,从添加的数字到选项。当然,这是一个组成的例子,但真实的东西有这样的参数。 更新
终于在Gumbo的建议之后找到了它。 我首先尝试了Gumbo的领先优势(添加了> 0): 但它也没有用。 经过一些小事,我发现罪魁祸首是状态字段中选项之间的空格。这些记录是从另一个源导入的,并带有以逗号后的空格: '选项,option1'代替'option,option1' 所以我最终得到了: 这对我有用。SELECT * FROM table WHERE status contains ( 'option' );
SELECT * FROM table WHERE status LIKE '%option%' );
id,name,status
1,'test1','option,option1'
2,'test2','option,option2'
3,'test3','option2'
4,'test4','option2,option3'
5,'test5','option'
SELECT * FROM table WHERE status contains ( 'option' );
SELECT * FROM table
WHERE FIND_IN_SET('option', status) > 0;
SELECT * FROM table
WHERE FIND_IN_SET('option', TRIM(REPLACE(status,' ',''))) > 0;
答案 0 :(得分:10)
对于以逗号分隔的值,您可以使用FIND_IN_SET
function在其中搜索值:
SELECT * FROM table WHERE FIND_IN_SET('option', status);
要取消表达式,请使用NOT
or !
:
SELECT * FROM table WHERE NOT FIND_IN_SET('option', status);
答案 1 :(得分:0)
如果可以,您可能只想修复列数据,而不必在查询中运行额外的逻辑:
UPDATE `table` SET `status` = REPLACE(`status`, ', ', ',');
然后你可以:
SELECT * FROM table WHERE FIND_IN_SET('option', status);