1

我不清楚 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表达式也经过测试并与慢车匹配。结果集包含快车和慢车。

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

4

1 回答 1

1

SELECT 测试 Cars 的每条记录。

  • 快车匹配 CASE 块中的第一个 WHEN
  • 慢车匹配 CASE 块中的第二个 WHEN
  • 不是真的快不匹配 CASE 块中的任何标准

如果您只想要快车,请尝试像这样声明 @Include_list:

DECLARE @Include_List VARCHAR(100) = (SELECT 'Get fast cars')
于 2013-05-23T07:15:36.600 回答