1

我喜欢反转这个查询:

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

在像这样的查询中

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

其中字段“状态”列包含(通过示例):“选项,选项 1”。

当我使用

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

它还选择具有仅包含 'option1' 的 'status' 列的行

这可能吗?

示例数据:

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。

“状态”字段类型是 varchar。

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

更新: 在秋葵的建议下终于找到了。

我首先尝试了 Gumbo 的铅(添加了 > 0):

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

但它也没有奏效。

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

'option, option1' 而不是 'option,option1'

所以我最终得到:

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

这对我有用。

4

2 回答 2

10

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

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

要否定表达式,请使用NOTor!

SELECT * FROM table WHERE NOT FIND_IN_SET('option', status);
于 2012-06-21T08:43:54.803 回答
0

不必在查询中运行额外的逻辑,如果可以的话,您可能只想修复列数据:

UPDATE `table` SET `status` = REPLACE(`status`, ', ', ',');

然后你可以:

SELECT * FROM table WHERE FIND_IN_SET('option', status);
于 2017-01-11T22:49:22.497 回答