0

我有一个 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)
4

2 回答 2

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,所以我的回答会对你有所帮助。

于 2013-01-09T19:42:29.407 回答
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)

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

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

于 2013-01-09T19:47:32.987 回答