Sql在其中条件和行数的行数

时间:2013-12-20 10:48:35

标签: sql firebird2.5

Hello currenty我发现我的自我在一个dillema中,如果有一个解决方案可以使用:

假设我们有一个表具有字段User_id,Building_id

的用户

表值:

user_id | building_id
-------   -----------
1       | 1
2       | 1
3       | 2
4       | 2
5       | 2

我们选择了

Select * from users where building_id = 1

这将获取2行。

Select * from users where building_id = 2

这将获取3行。

Select * from users 
  where (:modus = 1 and building_id = 1) or 
        (:modus = 2 and building_id = 2)

如果我通过它将获取多少行:modus = 1 ??它读取5行但显示2行。

所以问题是如何使用params来创建不会读取所有数据并仅显示其中一部分的sql?

更新1(视觉结果):

IBExpert中的结果:

普通SQL

Normal SQL

Result

带参数的SQL,传递Modus = 1

SQL with Parameters

Result

两种情况下的视觉结果:

enter image description here

更新2(真实数据库结果):

非参数构建= 1

enter image description here

按预期获得12

enter image description here

按预期阅读12

enter image description here


非参数建筑= 2

enter image description here

取得预期的5924

enter image description here

按预期阅读5924

enter image description here


参数化,其中Param = 1,因此Building = 1

enter image description here

enter image description here

正如您在右上角所见的获取金额12s

enter image description here

但在性能分析中它的5936

enter image description here

1 个答案:

答案 0 :(得分:0)

当您使用参数化查询时,Firebird优化器会在准备时决定计划,而不是在执行时。据我所知,内部Firebird 不知道这两个参数是相同的(据我所知,内部Firebird只有位置和非命名参数!)。这意味着Firebird准备了一个计划,该计划将评估这两个条件,因此它将执行两者的所有读取。

我认为您的条件比您的问题更复杂,因此building_id = :modusbuilding_id = CASE :modus WHEN 1 THEN 1 WHEN 2 THEN 2 END等解决方案无效。

您可以尝试UNION这两个查询,如果查找条件的计算结果为false,则查询执行可能实际上不会读取两个联合流之一的数据页。