sql查询以逐步修改where条件,直到result包含所需内容

时间:2010-05-16 05:11:41

标签: java mysql jdbc

我需要一个sql查询来根据基于类别字段的某些条件从表中选择一些项目。 作为一个例子,考虑人员列表,我从数据库中获取特定年龄组的人员。我想检查结果是否包含来自多个类别中的每一个的至少一个结果。如果不是,我想通过扩展它来修改年龄组并再次检查结果。重复这一过程,直到我得到一个年龄组,每个类别都有一个结果。现在我通过分析结果和修改sql查询来做到这一点。因此发送了许多sql select查询。这样做最有效的方法是什么? 我正在使用jdbc从java程序调用select查询。我正在使用mysql数据库。

2 个答案:

答案 0 :(得分:1)

您需要创建如下所示的程序或功能,可以轻松解决您的问题

create procedure GetPeople
     @condition varchar(max)
    as 

    begin
    declare @affectRec int

    SET @ParmDefinition = N'@cound nvarchar(max), @cout int output';

      declare @@query nvarchar(max)
      set @query= 'select * from people where  @cond;  set @cout=@@rowcount'

      exec @query

     EXECUTE sp_executesql
@query
,@ParmDefinition
,@cond = @condition
,@count = @affectRec output
;


      if @affectRec > 0
      begin
       return;
      end 
      else 
      begin
       //update condition code 
       exec GetPeople(condition)
      end  

end

答案 1 :(得分:1)

您可以在单个查询中执行此操作,方法是不对您不知道范围的类别应用过滤。关键是按照理想值或理想范围的“距离”进行排序。

例如,如果您知道A类和A类的固定值(a和b)。 B,但想要找到C类的值,更喜欢最接近'idealC'的值,那么你可以做

SELECT 
   A, B, C,... FROM YorData 
WHERE
   CategoryA=a AND CategoryB=b 
ORDER BY abs(C-<idealC>)

如果您只想要一个匹配的行,则在查询中添加“LIMIT 1”。

您可以将其扩展为在范围上工作,要将类别C的值范围视为“理想”,还要查找不在此范围内的行,请将order by子句更改为

ORDER BY LEAST(C-maxC, minC-C)

(其中minC / maxC定义了您最感兴趣的值范围。)

这将首先在范围内产生行,然后是范围之外的行。和以前一样,你可以使用LIMIT 1来获取一行。