检索以逗号分隔的列表中存在值的行

时间:2012-06-21 08:38:47

标签: mysql

我想反转此查询:

SELECT * FROM table WHERE status IN ( option,option1,option2 );

等查询中

SELECT * FROM table WHERE status contains ( 'option' );

字段'status'列包含(例如):'option,option1'。

当我使用

SELECT * FROM table WHERE status LIKE '%option%' );

它还会选择“status”列中仅包含“option1”

的行

这可能吗?

示例数据:

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' );

此查询应选择选择记录1,2和5.

'status'字段类型为varchar。

问题是状态字段包含几乎相似的数据,从添加的数字到选项。当然,这是一个组成的例子,但真实的东西有这样的参数。

更新 终于在Gumbo的建议之后找到了它。

我首先尝试了Gumbo的领先优势(添加了> 0):

SELECT * FROM table 
    WHERE FIND_IN_SET('option', status) > 0;

但它也没有用。

经过一些小事,我发现罪魁祸首是状态字段中选项之间的空格。这些记录是从另一个源导入的,并带有以逗号后的空格:

'选项,option1'代替'option,option1'

所以我最终得到了:

SELECT * FROM table 
    WHERE FIND_IN_SET('option', TRIM(REPLACE(status,' ',''))) > 0;

这对我有用。

2 个答案:

答案 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);