相当于使用AND而不是OR逻辑的“IN”?

时间:2011-11-11 00:10:33

标签: sql-server tags where sql-match-all

我知道我在这里用动态SQL打破了一些规则,但我还是要问。我继承了一个表,其中包含我需要从中提取记录的每个票证的一系列标记。

简单示例...我有一个包含“'苹果','橘子','葡萄'”的数组,我正在尝试检索包含数组中包含的所有项的所有记录

我的SQL看起来像这样:

 SELECT * FROM table WHERE basket IN ( " + fruitArray + " )

当然这相当于:

 SELECT * FROM table WHERE basket = 'Apples' OR basket = 'Oranges' OR basket = 'Grapes'

我很好奇是否有一个与IN(数组)相同的函数,除了它使用AND而不是OR以便我可以得到相同的结果:

 SELECT * FROM table WHERE basket LIKE '%Apples%' AND basket LIKE '%Oranges%' AND basket LIKE '%Grapes%'

我可能只是手动生成整个字符串,但如果可能的话,想要更优雅的解决方案。任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:1)

这是SQL中一个非常常见的问题。基本上有两种解决方案:

  1. 匹配列表中的所有行,按照在所有这些行上具有公共值的列进行分组,并确保组中不同值的计数是数组中元素的数量。

    SELECT basket_id FROM baskets
    WHERE basket IN ('Apples','Oranges','Grapes')
    GROUP BY basket_id
    HAVING COUNT(DISTINCT basket) = 3
    
  2. 为数组中的每个不同值执行自联接;只有这样,您才能比较一个WHERE表达式中多行的值。

    SELECT b1.basket_id
    FROM baskets b1
    INNER JOIN baskets b2 USING (basket_id)
    INNER JOIN baskets b3 USING (basket_id)
    WHERE (b1.basket, b2.basket, b3.basket) = ('Apples','Oranges','Grapes')
    

答案 1 :(得分:0)

在全文搜索中可能会有类似的内容,但总的来说,我真诚地怀疑这样的运算符在与LIKE的联合之外非常有用。

考虑:

SELECT * FROM table WHERE basket ='Apples' AND basket = 'Oranges'

它总是匹配零行。

答案 2 :(得分:0)

如果basket是一个字符串,就像您的示例所示,那么您最接近的就是使用LIKE '%apples%oranges%grapes%',可以使用'%'.implode('%', $tags).'%'轻松构建

这个问题是,如果某些“标记”可能包含在其他标记中,例如'supercalifragilisticexpialidocious' LIKE '%super%'将是真的。

答案 3 :(得分:0)

如果您需要进行LIKE比较,我认为您运气不好。如果您正在进行精确比较,以任意顺序调用匹配集,则应查看INTERSECT语句的EXCEPTSELECT选项。他们有点混乱,但可能非常强大。 (你必须将分隔的字符串解析成表格格式,但当然你还是这样做,不是吗?)

答案 4 :(得分:0)

您要搜索的商品在购物篮中的订单总是一样吗?如果是,单个LIKE就足够了:

SELECT * FROM table WHERE basket LIKE '%Apples%Oranges%Grapes%';

将数组连接到带有%分隔符的字符串应该是微不足道的。