我有一個名爲Properties
(pid,uid,pname,pvalue)的表。 pid列是自動生成的。每個uid(用戶標識)可以有多個存儲在pname和pvalue中的名稱值對。Where子句中有多個名稱/值對的SQL查詢
作爲輸入,我爲pname和pvalue創建了多個名稱值對,它們構成了一個複雜的布爾表達式。
例如:讓我們開始帶有一個名稱值對。假設我想要檢索所有'favorite_color'爲'紅色'的uid。
我寫了一個SQL查詢:
SELECT *
FROM properties
WHERE ((pname = 'favorite_color') and (pvalue = 'red'))
查詢,如果我不得不檢索類似,獲取所有的UID,其「favorite_color」是「紅色」或「藍色」和「favorite_drink」很快變得複雜是「果汁」或「奶」和‘favorite_愛好’是‘音樂’或‘藝術’等
我寫了一個SQL查詢:
SELECT *
FROM properties
WHERE (((pname = 'favorite_color') and (pvalue = 'red'))
OR ((pname = 'favorite_color') and (pvalue = 'blue')))
AND (((pname = 'favorite_drink') and (pvalue = 'juice'))
OR ((pname = 'favorite_drink') and (pvalue = 'milk')))
AND (((pname = 'favorite_hobby') and (pvalue = 'music'))
OR ((pname = 'favorite_hobby') and (pvalue = 'art')))
我表達正確但不幸的是它失敗,因爲評估是在每一行完成的。如果我想爲where子句添加更多名稱值對,該怎麼辦?
問題:
是否可以寫,爲此SQL查詢?
我的另一個想法是獲取每個用戶的所有pname,pvalue對,使用表達式語言和我的輸入名稱值巴黎來構建一個動態表達式來評估它。我在考慮apache的JEXL。
使用'UNION' /'UNION ALL'(根據需要)分開標準 –
您是否在暗示這樣的事情? SELECT * FROM properties WHERE(((pname ='favorite_color')和(pvalue ='red')) OR((pname ='favorite_color')和(pvalue ='blue')))UNION SELECT * FROM ((pname ='favorite_drink')和(pvalue ='juice')) OR ='favorite_hobby')和(pvalue ='music')) OR((pname ='favorite_hobby')和(pvalue ='art'))) – user977505
是的,這是正確的 –