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

时间:2013-01-09 19:34:43

标签: sql database oracle-apex

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

条件外观的一个例子 -

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)

2 个答案:

答案 0 :(得分:0)

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

(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条件。通常它是AND,所以我的答案会帮助你。

答案 1 :(得分:0)

似乎很多组合都是"允许"一些项目为空。

实现这一目标的一种方法是拥有所有组合,但使用COALESCE可以实现真正的条件。例如,您可以更改以下列出的所有项目

 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)

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

我必须查看您的所有业务规则,以确定是否需要以及如何创建,但这是最糟糕的方式。毕竟它是一个关系数据库..。建立一个解决它的关系!