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?
IBExpert中的结果:
普通SQL
带参数的SQL,传递Modus = 1
两种情况下的视觉结果:
非参数构建= 1
按预期获得12
按预期阅读12
非参数建筑= 2
取得预期的5924
按预期阅读5924
参数化,其中Param = 1,因此Building = 1
正如您在右上角所见的获取金额12s
但在性能分析中它的5936
答案 0 :(得分:0)
当您使用参数化查询时,Firebird优化器会在准备时决定计划,而不是在执行时。据我所知,内部Firebird 不知道这两个参数是相同的(据我所知,内部Firebird只有位置和非命名参数!)。这意味着Firebird准备了一个计划,该计划将评估这两个条件,因此它将执行两者的所有读取。
我认为您的条件比您的问题更复杂,因此building_id = :modus
或building_id = CASE :modus WHEN 1 THEN 1 WHEN 2 THEN 2 END
等解决方案无效。
您可以尝试UNION
这两个查询,如果查找条件的计算结果为false,则查询执行可能实际上不会读取两个联合流之一的数据页。