私はしようとしています:
select tbl.*, (true and true) as booleanTest
from tbl
どのms-sqlは評価していないようです。(キーワード'および'の近くの構文が正しくありません)
無知に恵まれた私はこれが標準のANSI-何かだと思いました。
Q:上記はより普遍的なSQL構文で表現できますか?
私はしようとしています:
select tbl.*, (true and true) as booleanTest
from tbl
どのms-sqlは評価していないようです。(キーワード'および'の近くの構文が正しくありません)
無知に恵まれた私はこれが標準のANSI-何かだと思いました。
Q:上記はより普遍的なSQL構文で表現できますか?
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
あなたは何を達成することを期待していますか?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