假设我们需要检查三个布尔条件来执行选择查询。让三个标志为'A','B'和'C'。
如果所有三个标志都设置为“1”,那么要生成的查询是 SELECT * FROM Food WHERE Name In('Apple,'Biscuit','Chocolate'); 如果仅将标志“A”和“B”设置为“1”且C设置为“0”。然后生成以下查询。
SELECT *
FROM Food
WHERE Name In ('Apple, 'Biscuit');
最好的方法是什么?
答案 0 :(得分:2)
SELECT *
FROM Food
WHERE (Name = 'Apple' AND <condition A>)
OR (Name = 'Biscuit' AND <condition B>)
OR (Name = 'Chocolate' AND <condition C>)
现在,虽然正确,但从性能的角度来看这是不可取的,因为条件A,B和C不是数据驱动的(它们不会在行之间变化)。因此,您可以通过动态构造SQL来使用所有可能条件的排列 - 使用IN子句并动态构造其字符串。
另一种解决方案是通过单独运行每个SELECT(伪代码)来在客户端组装最终结果:
if A then {
result1 = execute("SELECT * FROM Food WHERE Name = 'Apple')
}
if B then {
result2 = execute("SELECT * FROM Food WHERE Name = 'Biscuit')
}
if C then {
result2 = execute("SELECT * FROM Food WHERE Name = 'Chocolate')
}
result = join(result1, result2, result3)
当您只有一两个真实条件的案例百分比很高时,此解决方案可能会有效。
答案 1 :(得分:0)
首先,您可能需要检查是否所有内容均为false并显示错误。如果你的情况可以接受,可能不是。
然后如果这些标志仅仅是bool变量do(伪代码)
sql = "SELECT *
FROM Food
WHERE Name In (";
if (A) sql += "'Apple', "
if (B) sql += "'Biscuit', "
if (C) sql += "'Chocolate', "
sql = sql.deleteLastCharacter() + ");";
答案 2 :(得分:0)
为什么不在查询中包含A / B / C? 从食物中选择*(name ='Apple'或NOT A)和(name ='Biscuit'或NOT B)......
答案 3 :(得分:0)
我认为应该阅读:Dynamic SQL。
sp_executesql系统存储过程显示非常有用。
答案 4 :(得分:0)
这是一个非常复杂的主题,具有许多微妙的性能影响。你真的需要阅读Erland Sommarskog的这些优秀文章: