2011-11-11 39 views
2

我知道我在這裏用動態SQL打破了一些規則,但我仍然需要問。我已經繼承了一張表,其中包含我需要從中提取記錄的每張票的一系列標記。使用AND而不是OR邏輯的「IN」等效?

簡單的例子......我有一個包含「‘蘋果’,‘桔子’,‘葡萄’」的數組和我試圖檢索包含包含在陣列中的所有項目中的所有記錄。

我的SQL是這樣的:

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

這當然是等價的:

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

我很好奇,如果有,其工作方式相同(陣列功能),除了它使用AND而不是OR,以便我可以獲得與以下相同的結果:

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

我可能只是手動生成整個字符串,但如果可能的話,想要更優雅的解決方案。任何幫助,將不勝感激。

+0

簡答題。不可以。您可以構建子查詢,但我不認爲這就是您要求的。 – drdwilcox

+0

'IN'不是順便說一句。這是一個運營商。 –

+0

「籃子」欄是什麼類型? – connec

回答

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') 
    
0

在全文搜索中可能有類似的情況,但總的來說,我真誠地懷疑這樣的操作符會非常有用,除了與LIKE聯合之外。

考慮:

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

它總是匹配零行。

0

如果basket是一個字符串,如你的例子說明,那麼你就可以得到最接近的是使用LIKE '%apples%oranges%grapes%',它可以很容易地'%'.implode('%', $tags).'%'

與此問題是,如果一些「標籤」的可能是建被包含在其他標籤中,例如'supercalifragilisticexpialidocious' LIKE '%super%'將是真實的。

0

如果您需要做LIKE比較,我認爲你運氣不好。如果您正按照任意順序進行精確的比較,則應查看SELECT語句的INTERSECTEXCEPT選項。他們有點混亂,但可以相當強大。 (你必須將你的分隔字符串解析爲表格格式,但是當然你是這麼做的,不是嗎?)

0

您正在搜索的項目是否始終以相同的順序?如果是的話,單等應該足夠了:

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

和連接你的陣列與隔板%的字符串應該是微不足道的。

相關問題