我希望得到如下的t-sql语句......
SELECT [field]
FROM [table]
WHERE CASE @flag
WHEN 1 THEN col1 = @value
ELSE col2 = @different_value
END
关键是我想在我的函数中放置一个标志,以便在同一个查询中使用不同的where子句。我无法让它发挥作用。这可能吗?
答案 0 :(得分:4)
这对你有用吗?
Where (@flag = 1 and col1 = @value) or (@flag != 1 and col2 = @different_value).
答案 1 :(得分:1)
使用mySQL,你的语句应该可以工作,因为mySQL支持二进制表达式。
所以你必须尝试这个
SELECT [field]
FROM [table]
WHERE CASE @flag
WHEN 1
THEN case when col1 = @value then 1 else 0 end
ELSE case when col2 = @different_value then 1 else 0 end
END = 1
这不是很好的可读性。请注意性能问题,因为优化器可能会在这里遇到困难。
答案 2 :(得分:1)
基于给定参数动态更改搜索是一个复杂的主题,并且以一种方式对其进行操作,即使只有非常小的差异,也会产生巨大的性能影响。关键是使用索引,忽略紧凑代码,忽略担心重复代码,必须做出好的查询执行计划(使用索引)。
阅读本文并考虑所有方法。您最好的方法取决于您的参数,数据,架构和实际使用情况:
Dynamic Search Conditions in T-SQL by by Erland Sommarskog
The Curse and Blessings of Dynamic SQL by Erland Sommarskog
这将产生最佳执行计划:
IF @flag=1
BEGIN
SELECT
[field]
FROM [table]
WHERE col1 = @value
END
ELSE
BEGIN
SELECT
[field]
FROM [table]
WHERE col2 = @different_value
END
但是,如果您必须使用单个查询,则最好使用索引
SELECT
[field]
FROM [table]
WHERE @flag=1
AND col1 = @value
UNION ALL
SELECT
[field]
FROM [table]
WHERE @flag!=1
AND col2 = @different_value
答案 3 :(得分:0)
你也可以使用布尔逻辑:
SELECT blah FROM myTable WHERE (@i IS NULL OR AnotherCondition)
答案 4 :(得分:0)
简单来说;
WHERE
(@flag = 1 AND col1 = @value)
OR
(@flag = 2 AND col2 = @different_value)
...