代码之家  ›  专栏  ›  技术社区  ›  Rohit Banga

sql查询以增量方式修改where条件,直到结果包含所需内容

  •  0
  • Rohit Banga  · 技术社区  · 16 年前

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

    2 回复  |  直到 16 年前
        1
  •  1
  •   Pranay Rana    16 年前

    您需要创建如下所示的程序或函数,这样可以轻松解决您的问题

    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
    
        2
  •  1
  •   mdma    16 年前

    您可以在单个查询中完成这一操作,方法是不对您不知道范围的类别应用筛选。关键是按理想值或理想范围的“距离”排序。

    例如,如果您知道类别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只获取一行。

    推荐文章