2

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

最好的方法是什么?

4

5 回答 5

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)

当您只有一个或两个真实条件的案例比例很高时,此解决方案可能会起作用。

于 2010-03-15T16:53:24.950 回答
0

首先,您可能需要检查是否全部为假并显示错误。或者如果您的情况可以接受,则可能不是。

那么如果这些标志仅仅是布尔变量(伪代码)

sql = "SELECT * 
  FROM Food 
 WHERE Name In (";
if (A) sql += "'Apple', "
if (B) sql += "'Biscuit', "
if (C) sql += "'Chocolate', "
sql = sql.deleteLastCharacter() + ");";
于 2010-03-15T15:51:31.643 回答
0

为什么不在查询中包含 A/B/C?select * from food where (name = 'Apple' or NOT A) and (name = 'Biscuit' OR NOT B)...

于 2010-03-15T16:36:59.803 回答
0

我认为应该阅读:Dynamic SQL

sp_executesql系统存储过程显示也非常有用。

于 2010-03-15T16:46:35.977 回答
0

这是一个非常复杂的主题,具有许多微妙的性能影响。你真的需要阅读 Erland Sommarskog 的这些优秀文章:

T-SQL 中的动态搜索条件

动态 SQL 的祸与福

于 2010-03-15T17:22:43.757 回答