我想反转这个查询:
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)