这个案例陈述如何运作?

时间:2013-05-23 06:57:29

标签: tsql sql-server-2012

我不清楚where子句中这个case语句发生了什么。设置:

CREATE TABLE [dbo].[Cars](
    [Car] [varchar](20) NULL,
    [Fast] [varchar](10) NULL
) ON [PRIMARY]

INSERT [dbo].[Cars] ([Car], [Fast]) VALUES (N'Ford', N'No')
INSERT [dbo].[Cars] ([Car], [Fast]) VALUES (N'Holden', N'Yes')
INSERT [dbo].[Cars] ([Car], [Fast]) VALUES (N'Mazda', N'Not Really')
INSERT [dbo].[Cars] ([Car], [Fast]) VALUES (N'Toyota', N'Yes')

和查询:

declare @Include_List varchar(100) = (select 'Get fast cars, Get slow cars')

SELECT Car,Fast
FROM    Cars
where   case 
        when Fast = 'Yes' and CHARINDEX('Get fast cars',@Include_List) > 0 then 1
        when Fast = 'No' and CHARINDEX('Get slow cars',@Include_List) > 0 then 1
        else 0
    end = 1

我期待第一个when表达式匹配快车,然后退出case语句。然而,第二个when表达式也经过测试,并与慢车相匹配。结果集包含快速和慢速汽车。

不应该只返回第一次检查的结果吗?

1 个答案:

答案 0 :(得分:1)

SELECT测试汽车的每一条记录。

  • 快车与CASE区块中的第一个WHEN相匹配
  • 慢车与CASE区块中的第二个WHEN相匹配
  • 不太快不符合CASE块中的任何条件

如果您只想要快车,请尝试声明@Include_list,如下所示:

DECLARE @Include_List VARCHAR(100) = (SELECT 'Get fast cars')