如何使用具有多个值的like语句,同时排除我不想要的值?

时间:2014-07-24 17:39:17

标签: mysql sql sql-server

我的查询如下,但这将返回具有规则494,788以及任何其他规则的记录。如何限制它返回只有这两个规则的记录?

select * from result where rules like '%494%'
AND rules like '%788%'
AND tradedate >= '2014-01-01'

规则列中的示例记录如下所示:| 406 | 407 | 759 | 398 | 399 | 381 | 702 |

我想要返回所有包含494 AND 788的记录,但如果他们有任何其他规则ID,我不想要它们。

3 个答案:

答案 0 :(得分:3)

这样的事情(假设您有一个要排除的规则列表):

SELECT *
FROM result
WHERE rules IN ('494', '788', ...etc...)

如果您使用

... rules LIKE '%494%' AND rules LIKE '%788%'

这只会返回包含'494788'

等规则的记录

如果您使用

... rules LIKE '%494%' OR rules LIKE '%788%'...

这将返回'1494'和'4944'等规则,因为你的双方都有一个通配符。

答案 1 :(得分:1)

如果将这些表标准化,这将会容易得多。由于当多个规则适用于特定记录时,规则是否以任何特定顺序出现,因此您需要考虑所有可能的组合。这应该给你所有的结果:

SELECT * 
FROM result 
WHERE rules IN ('|494|', '|788|', '|494|788|', '|788|494|')
AND tradedate >= '2014-01-01'

如果您需要查询超过一个或两个规则的组合,如果您不将这些规则存储在具有一条规则的单独规范化表格中,那么您将遇到很多困难每排。在当前表单中,您有n ^ 2个可能的组合要检查,其中n是要检查的规则数。

答案 2 :(得分:0)

select * from result where (rules like '%494%'
OR rules like '%788%')
AND tradedate >= '2014-01-01'

OR将确保两个规则分别应用,并且括号确保两者仍将与交易日期进行比较。

如果您不需要14942或27885等规则中的任何内容,请从相应的一侧删除%符号(对于任意数量的字符,百分比是通配符,包括无),或使用适当的运算符(在这种情况下可能=)< / p>