Tsql 切换WHERE条件的CASE语句

Tsql 切换WHERE条件的CASE语句,tsql,case,where-clause,Tsql,Case,Where Clause,我希望有一个像下面这样的t-sql语句 SELECT [field] FROM [table] WHERE CASE @flag WHEN 1 THEN col1 = @value ELSE col2 = @different_value END 关键是我想在函数中设置一个标志,以便在同一查询中使用不同的where子句。我就是不能让它工作。这可能吗?对于mySQL,您的语句应该可以工作,因为mySQL支持二进制表达式 所以你必须试试这个 SELECT

我希望有一个像下面这样的t-sql语句

SELECT [field]
FROM [table]
WHERE CASE @flag
        WHEN 1 THEN col1 = @value
        ELSE col2 = @different_value
      END

关键是我想在函数中设置一个标志,以便在同一查询中使用不同的where子句。我就是不能让它工作。这可能吗?

对于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

这不是很好的可读性。请注意性能问题,因为优化器可能在这里遇到困难。

对于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

这不是很好的可读性。请注意性能问题,因为优化器可能在这里遇到困难。

这对您有用吗

Where (@flag = 1 and col1 = @value) or (@flag != 1 and col2 = @different_value). 

这对你有用吗

Where (@flag = 1 and col1 = @value) or (@flag != 1 and col2 = @different_value). 

基于给定参数动态更改搜索是一个复杂的主题,以一种方式而不是另一种方式进行搜索,即使只是非常微小的差异,也会对性能产生巨大影响。关键是要使用索引,忽略压缩代码,忽略对重复代码的担忧,必须制定好查询执行计划(使用索引)

<>阅读并考虑所有的方法。最佳方法取决于参数、数据、模式和实际使用情况:

这将产生最佳执行计划:

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

基于给定参数动态更改搜索是一个复杂的主题,以一种方式而不是另一种方式进行搜索,即使只是非常微小的差异,也会对性能产生巨大影响。关键是要使用索引,忽略压缩代码,忽略对重复代码的担忧,必须制定好查询执行计划(使用索引)

<>阅读并考虑所有的方法。最佳方法取决于参数、数据、模式和实际使用情况:

这将产生最佳执行计划:

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

您还可以使用布尔逻辑:

SELECT blah FROM myTable WHERE (@i IS NULL OR AnotherCondition)

您还可以使用布尔逻辑:

SELECT blah FROM myTable WHERE (@i IS NULL OR AnotherCondition)
简单一点怎么样

WHERE
  (@flag = 1 AND col1 = @value)
OR
  (@flag = 2 AND col2 = @different_value)
...
简单一点怎么样

WHERE
  (@flag = 1 AND col1 = @value)
OR
  (@flag = 2 AND col2 = @different_value)
...

优化器可能会在这里挣扎。
让它工作和让它快速工作(使用索引)通常是完全不同的。
优化器可能会在这里挣扎。
让它工作和让它快速工作(使用索引)通常是完全不同的。非常好。第一关,看起来很管用。我将继续测试,但我认为这是一个尝试。也很简单。谢谢除非包含选项(重新编译)并且运行在SQL Server 2008的某个版本上,否则不可能使用此选项的索引。请参阅我答案中的链接。此链接解释了2008年最新版本如何在考虑局部变量的运行时值的情况下重新编译查询。如果@flag不是1,如果它是1,那么像
(@flag=1和col1=@value)
这样的事情可以在查询之外进行优化,然后优化为
col1=@value
我正在运行SQL Server 2005,所以我想它还不会优化。非常好。第一关,看起来很管用。我将继续测试,但我认为这是一个尝试。也很简单。谢谢除非包含选项(重新编译)并且运行在SQL Server 2008的某个版本上,否则不可能使用此选项的索引。请参阅我答案中的链接。此链接解释了2008年最新版本如何在考虑局部变量的运行时值的情况下重新编译查询。如果@flag不是1,如果它是1,那么像
(@flag=1和col1=@value)
这样的事情可以在查询之外进行优化,然后优化为
col1=@value
我正在运行SQLServer2005,所以我想它还不会优化。我同意。我将把这些放在“必读”堆栈中。感谢您的回复。它“必须”是一个查询,因为我将它用作接收@flag参数的函数。我将测试union而不是where子句中的OR。这是一个相对较小的查询,所以我不知道它是否会产生巨大的差异,但最好了解不同数据集未来可能出现的问题。谢谢你的帮助!我同意。我将把这些放在“必读”堆栈中。感谢您的回复。它“必须”是一个查询,因为我将它用作接收@flag参数的函数。我将测试union而不是where子句中的OR。这是一个相对较小的查询,所以我不知道它是否会产生巨大的差异,但最好了解不同数据集未来可能出现的问题。谢谢你的帮助!