【问题标题】:Why can't I compare with the result of a comparison?为什么我不能与比较的结果进行比较?
【发布时间】:2016-07-15 16:40:14
【问题描述】:

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

让我们进一步假设,如果c2 等于'v',我想将update c1 转换为1,否则转换为0。我就是这样尝试的:

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

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

select c2 = 'v'
from t1;

它选择了所有行并显示'v' 而不是c2 的实际值。如您所见,我感到困惑的部分原因是= 运算符的矛盾性,部分原因是它在select 中的行为。当然,有效的问题已经解决了,但我想知道对于所描述的= 运算符的行为是否有一个清晰、合乎逻辑的解释。

【问题讨论】:

  • 语法错误是否有更多文本?还是只是“某物附近的语法错误”?
  • T-SQL 中没有布尔类型,也没有任意的“返回 1 或 0”机制。 (select token = value 尝试将值别名为令牌)
  • 试试SELECT (c2 = 'v') AS x FROM t1,告诉我们发生了什么。
  • c2 = 'v' 等价于'v' as c2。这是声明列别名的另一种语法。
  • @MartinSmith,这是真的,但没有回答这个问题......我必须承认,我之前并没有考虑太多,但是在测试之后将我的答案放在下面我感觉,SQL Server 根本不支持boolean...BIT 似乎是一个reduced INT...即使是返回BIT 的标量函数也必须查询与=0=1。所以我认为答案是:上面的比较根本没有可以在其他地方使用的数据类型......

标签: sql-server types boolean operators bit


【解决方案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;

但这不是一种可以直接使用的数据类型...即使是 boolean 标量函数,您也可以使用 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?

【讨论】:

  • 问题是我不明白我所经历的行为的原因。
  • @LajosArpad 请查看我的更新。其他与许多语言一样,比较不会返回您可以在某处分配的数据类型 BIT 的值。 BIT 返回函数必须用dbo.function()=0 质疑。布尔结果是 - 但我无法真正解释这一点 - 一些特别的东西......
  • @LajosArpad 再想一想:我认为BIT 被处理为INT,但减少为01,这就是为什么必须查询位函数的原因使用=0=1,即使人们可能期望,结果已经是布尔值。 real boolean 值来自比较,但不是可以直接使用的数据类型...
  • 非常好的更新! SQL Server 没有布尔类型,因为 BIT 只是一位二进制数。
  • @LajosArpad,仅供参考:我重写了我的答案,将所有的 cmets 和想法合二为一......
猜你喜欢
  • 1970-01-01
  • 2011-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2015-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多