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

Kla*_*aaz 1 mysql

我想反转这个查询:

SELECT * FROM table WHERE status IN ( option,option1,option2 );
Run Code Online (Sandbox Code Playgroud)

在一个查询中

SELECT * FROM table WHERE status contains ( 'option' );
Run Code Online (Sandbox Code Playgroud)

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

我用的时候

SELECT * FROM table WHERE status LIKE '%option%' );
Run Code Online (Sandbox Code Playgroud)

它还会选择"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' );
Run Code Online (Sandbox Code Playgroud)

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

'status'字段类型是varchar.

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

更新: 终于在Gumbo的建议之后找到它.

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

SELECT * FROM table 
    WHERE FIND_IN_SET('option', status) > 0;
Run Code Online (Sandbox Code Playgroud)

但它也没有用.

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

'option,option1'代替'option,option1'

所以我最终得到了:

SELECT * FROM table 
    WHERE FIND_IN_SET('option', TRIM(REPLACE(status,' ',''))) > 0;
Run Code Online (Sandbox Code Playgroud)

这对我有用.

Gum*_*mbo 10

对于逗号分隔值,您可以使用该FIND_IN_SET函数在其中搜索值:

SELECT * FROM table WHERE FIND_IN_SET('option', status);
Run Code Online (Sandbox Code Playgroud)

要否定表达,请使用NOT!:

SELECT * FROM table WHERE NOT FIND_IN_SET('option', status);
Run Code Online (Sandbox Code Playgroud)