2012-07-12 23 views
0

我需要爲報表編寫SQL查詢。用戶可以選擇六個動態濾波器,即用戶可以選擇一個或兩個最多六個濾波器。可用於上述場景的SQL函數

在每個過濾器中,用戶從下拉列表中選擇設備的屬性,操作員及其值用戶需要輸入。這樣就構成了一個過濾器,e.g:

 AttributeName Operator Value 
    Cost   equal  480 
AND MappedName  contains DummyString 

這裏的「成本」屬性和「480」是價值,這整個事情由一個過濾器。用類似的方式,用戶可以選擇最大。 6個濾波器 兩個濾波器之間的運算符也是動態的。它可以是「AND」或「OR」

在報告中,我需要爲每個過濾器動態生成一列以及一些靜態列,例如,器件名稱,器件製造是靜態列,而上述過濾器是動態的。

因此,當用戶選擇了兩個過濾器看起來像報告:

DeviceName DeviceManufactur Cost    MappedName  
D1   DM1    480    DummyString 
D2   DM2    480    DummyString 

在屬性存儲類似數據庫:

DeviceName DeviceManufactur AttributeName    AttributeValue 
    D1   DM1    Cost      480 
    D1   DM1    MappedName    DummyString 
    D2   DM2    Cost      480 
    D2   DM2    MappedName    DummyString 

所以,當我寫簡單的SQL像

select d.name,d.manufacture,d.AttName,d.value 
from Device d 
where d.AttName='Cost' and d.AttValie='480' 
    and d.AttName='MappedName' and d.AttValue='DummyString' 

它永遠不會給我任何記錄,雖然設備是相關的與這兩個屬性相關聯。

任何人都可以提出任何特定的SQL函數,這將有助於我有效地編寫此邏輯。

+0

如果我明白你需要做什麼,我認爲你需要看[dynamic sql](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/dynamic.htm),根據選定的標準逐個建立您的查詢。可能傳入你自己的函數,也許會返回一個引用光標或其他東西。但是你需要非常小心SQL注入。 – 2012-07-12 16:28:49

回答

0

我不認爲我真的理解你的問題的權利,但我能想到的唯一的事情就是:

SELECT d.DeviceName, d.DeviceManufactur, d.AttributeName, d.AttributeValue 
FROM aDevice d 
WHERE d.DeviceName IN (
    SELECT dd.DeviceName 
    FROM aDevice dd 
    WHERE EXISTS (SELECT 1 FROM aDevice ddd WHERE AttributeName='Cost' AND AttributeValue='480' AND ddd.DeviceName = dd.DeviceName) 
    AND EXISTS (SELECT 1 FROM aDevice ddd WHERE AttributeName ='MappedName' AND AttributeValue = 'DummyString' AND ddd.DeviceName = dd.DeviceName)) 

這應返回的所有信息,其查詢Cost = '480' AND MappedName = 'DummyString'匹配的任何設備..