简化Apex应用程序中的SQL查询

简化Apex应用程序中的SQL查询,sql,database,oracle-apex,Sql,Database,Oracle Apex,我有一个Apex应用程序,它包含几个下拉栏,允许用户选择各种值来查询附加的数据库。基本上,由于查询中的条件,查询变得越来越大。条件是它检查所有下拉列表中的每个值,或者它们是否为空等等。我的问题是如何简化查询,这样我就不必写输入的所有可能的数据组合。就像这个字段是空的,这个不是,现在这个是等等 条件如何的示例- OR (plant_type.plant_type = :P1_PLANT_TYPE AND plant.plant_name = :P1_PLANT_NAME AND :P3_SOIL

我有一个Apex应用程序,它包含几个下拉栏,允许用户选择各种值来查询附加的数据库。基本上,由于查询中的条件,查询变得越来越大。条件是它检查所有下拉列表中的每个值,或者它们是否为空等等。我的问题是如何简化查询,这样我就不必写输入的所有可能的数据组合。就像这个字段是空的,这个不是,现在这个是等等

条件如何的示例-

OR
(plant_type.plant_type = :P1_PLANT_TYPE AND plant.plant_name = :P1_PLANT_NAME AND :P3_SOIL IS NULL AND :P3_SUNLIGHT IS NULL)
OR 
(plant_type.plant_type = :P1_PLANT_TYPE AND :P1_PLANT_NAME IS NULL AND :P3_SOIL IS NULL AND :P3_SUNLIGHT IS NULL) 
OR
(sunlight_conditions.condition_details = :P3_SUNLIGHT AND :P3_SOIL IS NULL AND plant_type.plant_type = :P1_PLANT_TYPE AND plant.plant_name = :P1_PLANT_NAME)
OR
(soil_conditions.soil_condition = :P3_SOIL AND :P3_SUNLIGHT IS NULL AND plant_type.plant_type = :P1_PLANT_TYPE AND plant.plant_name = :P1_PLANT_NAME)

更好的方法是只包含每个查询条件一次,如下所示:

(plant_type.plant_type = :P1_PLANT_TYPE or :P1_PLANT_TYPE IS NULL)
and
(plant.plant_name = :P1_PLANT_NAME or :P1_PLANT_NAME IS NULL)
and
(sunlight_conditions.condition_details = :P3_SUNLIGHT or :P3_SUNLIGHT IS NULL)
and
(soil_conditions.soil_condition = :P3_SOIL or :P3_SOIL IS NULL)

当然,这取决于您是否希望在它们之间设置OR条件或and条件。通常是和,所以我的答案会对你有所帮助。

看起来你的很多组合“允许”某些项为空

实现这一点的一种方法是使用所有的组合,但使用COALESCE fall转换为真实条件。例如,您也可以更改列出的所有项目,如下所示

 plant_type.plant_type = COALESCE(:P1_PLANT_TYPE,plant_type.plant_type) AND 
 plant.plant_name = COALESCE(:P1_PLANT_NAME, plant.plant_name) AND
 soil_conditions.soil_condition = COALESCE(:P3_SOIL,soil_conditions.soil_condition) AND
 sunlight_conditions.condition_details = COALESCE(:P3_SUNLIGHT,sunlight_conditions.condition_details)

如果可能,上述情况不符合您的逻辑规则。在这种情况下,您可能必须创建一个要加入的条件表。该表可以描述哪些项目与哪些其他项目“搭配”的逻辑


我必须查看您的所有业务规则,以确定是否需要它以及如何创建它,但这是在哪里失控时的最佳方式。它毕竟是一个关系数据库。建立关系来解决它

哈哈,该死。谢谢你,阿伦!我对此困惑了一段时间,但实际上并没有考虑到这一点,因为它让一切变得容易多了。我不敢相信我在问之前没有想过要试试这个,对不起。谢谢你!