用sql构造动态语句

时间:2010-03-15 15:39:48

标签: sql tsql dynamic-sql

假设我们需要检查三个布尔条件来执行选择查询。让三个标志为'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');

最好的方法是什么?

5 个答案:

答案 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的这些优秀文章:

Dynamic Search Conditions in T-SQL

The Curse and Blessings of Dynamic SQL