在mssql中评估布尔返回值 - 可能吗?

时间:2012-04-27 08:36:24

标签: sql sql-server

我正在尝试:

select tbl.*, (true and true) as booleanTest
from tbl

ms-sql似乎并不欣赏。 (关键字'和'附近的语法不正确<)>

由于无知而感到愤怒,我认为这是标准的ANSI-something。

问:以上是否可以用更通用的sql语法表达?

2 个答案:

答案 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