2

我正在努力:

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

这 ms-sql 似乎并不欣赏。(关键字“和”附近的语法不正确)

因无知而幸福,我认为这是标准的 ANSI 东西。

Q:以上可以用更通用的sql语法来表达吗?

4

2 回答 2

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 所暗示的那样(我认为!),在传统逻辑中,我们可以应用幂等 重写规则,它指出

( P AND P )   <= is equivalent to =>   ( P )

碰巧,该规则适用于 SQL 的三值逻辑。

例如,在 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
于 2012-04-27T08:45:37.693 回答
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
于 2012-04-27T08:44:47.943 回答