假设我们需要检查三个布尔条件来执行选择查询。让三个标志为“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');
最好的方法是什么?
假设我们需要检查三个布尔条件来执行选择查询。让三个标志为“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');
最好的方法是什么?
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)
当您只有一个或两个真实条件的案例比例很高时,此解决方案可能会起作用。
首先,您可能需要检查是否全部为假并显示错误。或者如果您的情况可以接受,则可能不是。
那么如果这些标志仅仅是布尔变量(伪代码)
sql = "SELECT *
FROM Food
WHERE Name In (";
if (A) sql += "'Apple', "
if (B) sql += "'Biscuit', "
if (C) sql += "'Chocolate', "
sql = sql.deleteLastCharacter() + ");";
为什么不在查询中包含 A/B/C?select * from food where (name = 'Apple' or NOT A) and (name = 'Biscuit' OR NOT B)...
我认为应该阅读:Dynamic SQL。
sp_executesql系统存储过程显示也非常有用。