【发布时间】: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