Sql server 案例语句SQL:案例中的优先级?

Sql server 案例语句SQL:案例中的优先级?,sql-server,tsql,Sql Server,Tsql,当您在SQL(Server 2008)中使用CASE语句时,我有一个一般性问题,当条件为true但结果标志不同时,我有多个问题 这是一个假设性的示例,但在跨多个列应用检查对行中的数据进行分类时,可以转移。下面代码的输出取决于案例的排序方式,因为两者都是正确的 DECLARE @TESTSTRING varchar(5) SET @TESTSTRING = 'hello' SELECT CASE WHEN @TESTSTRING = 'hello' THEN '0' WHEN @TESTSTR

当您在SQL(Server 2008)中使用CASE语句时,我有一个一般性问题,当条件为true但结果标志不同时,我有多个问题

这是一个假设性的示例,但在跨多个列应用检查对行中的数据进行分类时,可以转移。下面代码的输出取决于案例的排序方式,因为两者都是正确的

DECLARE @TESTSTRING varchar(5)
SET @TESTSTRING = 'hello'

SELECT CASE 
WHEN @TESTSTRING = 'hello' THEN '0'
WHEN @TESTSTRING <> 'hi' THEN '1'
ELSE 'N/A' 
END AS [Output]
DECLARE@TESTSTRING varchar(5)
SET@TESTSTRING='hello'
选择案例
当@TESTSTRING='hello'时,则为'0'
当@TESTSTRING“hi”时,则为“1”
其他“不适用”
结束为[输出]

一般来说,以这种方式创建标志会被视为不好的做法吗?WHERE或语句更好吗?

Case语句保证按照编写顺序进行评估。使用第一个匹配值。因此,对于您的示例,将返回值
0

这在以下章节中有明确描述:

搜索的大小写表达式:

  • 按照指定的顺序计算每个WHEN子句的布尔_表达式
  • 返回计算结果为TRUE的第一个布尔\u表达式的结果\u表达式
  • 如果没有布尔_表达式的计算结果为TRUE,则如果指定了else子句,则数据库引擎将返回else_结果_表达式,或者 如果未指定ELSE子句,则为空值
至于这种做法是好是坏,我倾向于中立。这是ANSI行为,因此您可以依赖它,在某些情况下,它非常有用:

select (case when val < 10 then 'Less than 10'
             when val < 100 then 'Between 10 and 100'
             when val < 1000 then 'Between 100 and 1000'
             else 'More than 1000' -- or NULL
        end) as MyGroup
选择(val<10时的情况,然后选择“小于10”
当val<100时,则“介于10和100之间”
当val<1000时,则“介于100和1000之间”
否则“超过1000”-或为空
结束)作为MyGroup

进一步总结-当其中一个WHE子句为TRUE时,SQL将停止读取case/when语句的其余部分。例如:

SELECT 
    CASE 
        WHEN 3 = 3 THEN 3
        WHEN 4 = 4 THEN 4
    ELSE NULL 
    END AS test 

此语句返回3,因为这是返回TRUE的第一个WHEN子句,即使下面的语句也是TRUE。

我一直假设它们的计算顺序与它们在代码中出现的顺序相同,但仔细想想,我从未实际验证过这一点。从逻辑上讲,它是按照编码顺序进行的<代码>案例将在满足第一个条件时停止,然后是第二个条件,然后是其他条件。你测试过了吗?-1因为没有做任何研究。您可以在Microsoft的网站上找到所需的信息。@Kapol我理解在线描述的功能。我的问题是关于用户社区的最佳实践。@kapol-没有人喜欢微软的网站,在这里有答案更好。