可用于上述场景的SQL函数

时间:2012-07-12 16:01:01

标签: sql oracle

我需要为报告编写SQL查询。用户可以选择六个动态过滤器,即用户可以选择一个或两个最多六个过滤器。

在每个过滤器中,用户从下拉列表中选择设备的属性,操作员及其用户需要输入的值。这构成了一个过滤器,例如:

     AttributeName  Operator    Value
     Cost           equal       480
AND  MappedName     contains    DummyString

这里“Cost”是属性,“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的任何特定功能,这将有助于我有效地编写这个逻辑。

1 个答案:

答案 0 :(得分: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' ...

匹配的任何设备的所有信息