假设我有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
中的行为。当然,有效的问题已经解决了,但我想知道对于所描述的=
运营商的行为是否有明确,合理的解释。
答案 0 :(得分:1)
答案很简单:
SQL Server中有没有真正的布尔数据类型。有BIT
,但这只是一个减少到0
和1
的整数值,您必须将其与目标值进行比较。
这不起作用:
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的比较。
这将不返回false ,而是将xyz填入@tst
DECLARE @tst VARCHAR(100)='test';
SELECT @tst='xyz';
SELECT @tst;
使用 paranthesis SQL Server尝试获取该值,但该比较没有值...
SELECT (@tst='xyz'); --error
这将使用左侧作为别名
SELECT test=Column FROM Table;
这将只更新第二行
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?