为什么“选择(0 <1)”在Sql Server中不起作用?

时间:2019-11-27 08:51:09

标签: sql sql-server

如果我让MySQL执行SELECT (0 < 1),则返回1;否则,返回0。但是,如果我在SQL Server中运行此select语句,则会给我一个错误:

  

'<'附近的语法不正确。

我还测试了其他运算符,例如!=和<,并得到相同的错误。我很困惑。 “ 0 <1”是一个表达式,为什么SQL Server无法对其求值?

3 个答案:

答案 0 :(得分:2)

This behavior is by design

  

与其他SQL Server数据类型不同,布尔数据类型不能为   指定为表列或变量的数据类型,并且不能   返回结果集。

     

[...]

     

在WHERE子句中使用具有布尔数据类型的表达式来   筛选符合搜索条件的行,并在   流控制语言语句,例如IF和WHILE

因此存在布尔数据类型,您无法在WHERE子句(例如)之外使用它。


MySQL SELECT x < 1(返回0、1或NULL)的正确SQL Server等效项将是:

SELECT CASE
           WHEN x < 1       THEN 1
           WHEN NOT (x < 1) THEN 0
           ELSE             NULL -- you can omit this line
       END

最后,LEN(NULL)为NULL,并且(通常来说)对NULL的任何操作都会产生NULL。因此,条件IF LEN(NULL) < 1将不会执行,IF LEN(NULL) >= 1也将不会执行。

答案 1 :(得分:0)

MS SQL没有布尔类型。它支持布尔值 expressions ,但这些不能是变量或结果集中的值。

您能做的最好的事情就是

select case when 0 < 1 then 0 else 1 end

结果集将具有一个正常的整数(bit类型有时用于表示true / false值,但它只是一个可能值为1和0的数字)。

答案 2 :(得分:0)

  

我很困惑。 “ 0 <1”是一个表达式,为什么SQL Server无法对其求值?

有点是,不是。这是一个谓词,SQL Server对谓词的处理与产生 values 的其他表达式不同。

SQL Server没有用户可见的布尔数据类型,因此您无法编写一个表达式来生成此不存在的数据类型的值。

您只能在特定位置使用谓词,例如WHERE子句,ON子句,WHEN子句(CASE表达式的一部分)和{{1 }}约束(还有其他约束)