使用“IN”语法添加计算列

And*_*iff 3 index sql-server t-sql computed-column

我在 SQL Server 2008R2 中有一个查询,我想针对计算列运行该查询,而我又要对计算列进行索引 - 以加快速度。

该列现在是 int 类型。

我无法正确使用语法。

alter table dbo.tOutput Add StateNew as State IN (0, 10)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

Incorrect syntax near the keyword 'IN'.
Run Code Online (Sandbox Code Playgroud)

来自 C# 实体框架的查询应该稍后使用索引并且 - 很好 - 很快。

C#好像改成IN用法了,原来是这样的:

tOutput.Where(x => (x.State == 0) || (x.State == 10))
Run Code Online (Sandbox Code Playgroud)

生成的 SQL 读取

.. FROM tOutput WHERE State IN (0, 10) ..
Run Code Online (Sandbox Code Playgroud)

Sol*_*zky 6

我不认为你想要一个计算列。看起来您真正需要的是过滤索引(在 SQL Server 2008 中引入),WHERE [State] IN (0, 10)用作过滤器。创建此索引后,具有相同谓词的查询应使用此索引。请看一看:

仅供参考:计算列是一个需要返回标量值的表达式。State IN (0, 10)不是标量表达式,这就是您收到错误的原因。您可以将其修改为类似CONVERT(TINYINT, CASE [State] WHEN 0 THEN 1 WHEN 10 THEN 1 ELSE 0 END),但随后仍将包含所有行的索引。使用过滤索引将只包括匹配的行,这些行会更小更快:-)。

  • @AndreasReiff SQL Server 没有布尔类型,因此没有标量布尔值。如果表达式被修改为产生一个 INT 或一个 BIT,它将被接受,即:`.. ADD StateNew AS CASE WHEN State IN (0, 10) THEN 1 ELSE 0 END` (2认同)