2

私はしようとしています:

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

どのms-sqlは評価していないようです。(キーワード'および'の近くの構文が正しくありません)

無知に恵まれた私はこれが標準のANSI-何かだと思いました。

Q:上記はより普遍的なSQL構文で表現できますか?

4

2 に答える 2

4

SQL Serverは、標準SQLのデータ型をサポートしていませんBOOLEAN。これは、3つの値を持つ非常に奇妙な種類のブール値であることを思い出してください。リテラル値の代わり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の3値論理にも当てはまります。

たとえば、SQLServerでのケースの証明( 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 に答える