我知道我在这里用动态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%'
我可能只是手动生成整个字符串,但如果可能的话,想要更优雅的解决方案。任何帮助将不胜感激。
答案 0 :(得分:1)
这是SQL中一个非常常见的问题。基本上有两种解决方案:
匹配列表中的所有行,按照在所有这些行上具有公共值的列进行分组,并确保组中不同值的计数是数组中元素的数量。
SELECT basket_id FROM baskets
WHERE basket IN ('Apples','Oranges','Grapes')
GROUP BY basket_id
HAVING COUNT(DISTINCT basket) = 3
为数组中的每个不同值执行自联接;只有这样,您才能比较一个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
语句的EXCEPT
和SELECT
选项。他们有点混乱,但可能非常强大。 (你必须将分隔的字符串解析成表格格式,但当然你还是这样做,不是吗?)
答案 4 :(得分:0)
您要搜索的商品在购物篮中的订单总是一样吗?如果是,单个LIKE就足够了:
SELECT * FROM table WHERE basket LIKE '%Apples%Oranges%Grapes%';
将数组连接到带有%分隔符的字符串应该是微不足道的。