我正在尝试:
select tbl.*, (true and true) as booleanTest
from tbl
ms-sql似乎并不欣赏。 (关键字'和'附近的语法不正确<)>
由于无知而感到愤怒,我认为这是标准的ANSI-something。
问:以上是否可以用更通用的sql语法表达?
答案 0 :(得分:4)
SQL Server不支持标准SQL的BOOLEAN
数据类型,记住它是一种非常奇怪的布尔值,它有三个值!代替BOOLEAN
字面值,您必须替换评估为所需真值的表达式,例如
( 1 = 1 ) -- TRUE
( 0 = 1 ) -- FALSE
( 1 = NULL ) -- UNKNOWN
我经常写这样的代码(按照你的例子):
SELECT tbl.*,
CASE
WHEN ( ( 1 = 1 ) AND ( 1 = 1 ) ) THEN 'TRUE'
WHEN NOT ( ( 1 = 1 ) AND ( 1 = 1 ) ) THEN 'FALSE'
ELSE 'UNKNOWN'
END AS result
FROM tbl;
正如@Diego暗示的那样(我想!),在传统逻辑中,我们可以应用idempotence rewrite rule,其中指出
( P AND P ) <= is equivalent to => ( P )
实际上,该规则适用于SQL的三值逻辑。
e.g。 SQL Server中针对案例( UNKNOWN AND UNKNOWN ) <=> UNKNOWN
的证明:
SELECT CASE
WHEN ( 1 = NULL) AND ( 1 = NULL ) THEN 'TRUE'
WHEN NOT ( 1 = NULL) AND ( 1 = NULL ) THEN 'FALSE'
ELSE 'UNKNOWN'
END AS result
答案 1 :(得分:1)
您期望实现什么? SQl上没有布尔值,所以你可以这样做:
declare @a bit
declare @b bit
set @a=0
set @b=1
select
case
when @a=@b then 1
when not @a=@b then 0
else null
end as Bool_test
可能的结果:
@a @b Result
0 0 1
0 1 0
1 0 0
1 1 1
NUll any_value NULL
any_value NULL NULL