为什么我不能与比较的结果进行比较?

时间:2016-07-15 16:40:14

标签: sql-server types boolean operators bit

假设我有table这样:t1(c1,c2,...,cn)

如果update等于c1,我想进一步假设1 c2 'v' {}} 0。这就是我尝试的方式:

update t1
set c1 = (c2 = 'v');

我的目的是查看c2是否等于'v'并将逻辑值分配给c1。根据SSMS 2008,这有一个语法错误,所以我尝试了以下内容:

select c2 = 'v'
from t1;

它选择了所有行并显示'v'而不是c2的实际值。正如您所看到的,我感到困惑的部分原因是=运算符的矛盾,部分原因是它在select中的行为。当然,有效的问题已经解决了,但我想知道对于所描述的=运营商的行为是否有明确,合理的解释。

1 个答案:

答案 0 :(得分:1)

答案很简单:

SQL Server中有没有真正的布尔数据类型。有BIT,但这只是一个减少到01的整数值,您必须将其与目标值进行比较。

这不起作用:

DECLARE @bit BIT=1;
IF @bit DoSomething;

你必须使用

IF @bit=1 DoSomething;

CASE WHEN @bit=1 THEN ...

相同

但实际上有一个布尔值,就像我们从EXISTS知道的那样:

IF EXISTS(SELECT 1 FROM SomeWhere) DoSomething;

但这不是可以直接使用的数据类型...即使是布尔标量函数,您也要使用RETURNS BIT声明,并且必须使用返回值与0或1的比较。

专业1

这将不返回false ,而是将xyz填入@tst

DECLARE @tst VARCHAR(100)='test';
SELECT @tst='xyz';
SELECT @tst;

使用 paranthesis SQL Server尝试获取该值,但该比较没有值...

SELECT (@tst='xyz'); --error

专业2

这将使用左侧作为别名

SELECT test=Column FROM Table;

CASE

的解决方案

这将只更新第二行

DECLARE @tbl TABLE(c1 int,c2 int, c3 int);
INSERT INTO @tbl VALUES(1,1,1),(2,2,3),(4,4,4);
UPDATE @tbl SET c1=CASE WHEN c2<>c3 THEN 99 ELSE c1 END
SELECT * FROM @tbl

更多例子:

这些是禁止的

SET @bit=EXISTS(SELECT 1 FROM @tbl WHERE c1=50);
SET @bit=(EXISTS(SELECT 1 FROM @tbl WHERE c1=50));
SET @bit=(SELECT EXISTS(SELECT 1 FROM @tbl WHERE c1=50));

但这是允许的

SET @bit=CASE WHEN EXISTS(SELECT 1 FROM @tbl WHERE c1=50) THEN 1 ELSE 0 END;

有一个相关的问题,您可以进一步阅读:此相关问题也涉及这方面:Is there a Boolean data type in Microsoft SQL Server like there is in MySQL?