「and」と「&」の違い


13

私は論理演算の優先順位を理解しようとしていますが、次のコードがあります:

declare @T bit ='TRUE'
declare @F bit ='False'

print @T and @F

そして、エラーを返します

キーワード「and」付近の構文が正しくありません。

「and」を「&」に置き換えると、コードは再び機能します。前のコードが機能しなかったのはなぜですか?SQLサーバーを使用しています。

回答:


29
print @T & @F

戻り値 0

&あるビットAND演算子。

&ビット単位演算子は、2つの式の間でビット単位の論理ANDを実行し、両方の式に対応する各ビットを取得します。入力式の両方のビット(解決されている現在のビット)の値が1である場合にのみ、結果のビットは1に設定されます。それ以外の場合、結果のビットは0に設定されます。

あなたの場合、に@T & @F解決し1 & 0BIT値を持つデータ型の結果を返します0

PRINT演算子に渡されると、このbit結果は暗黙的に文字列にキャストされ、結果がクライアントに出力されます。


print @T and @F

それにはかなり多くの間違いがあります。

AND

2つのブール式を組み合わせ、両方の式がTRUEの場合にTRUEを返します

bitブール値と同じではありません。これらは互換性がなくbit、必要なときにSQL Serverが暗黙的にbooleanデータ型にキャストすることはありません(SQL ServerはSQL Booleanデータ型を実装しません。)

したがって、次のような式を使用する必要があります

@T = 'TRUE' AND @F = 'TRUE'

の代わりに

@T and @F

それでもあなたの問題は終わってPRINTいません- とにかくブール式を受け入れません。次のように式を使用できCASEます。

PRINT CASE 
          WHEN     (@T = 'TRUE' AND @F = 'TRUE') THEN 'True' 
          WHEN NOT (@T = 'TRUE' AND @F = 'TRUE') THEN 'False' 
          ELSE 'Unknown' -- SQL uses three valued logic
      END

ご回答有難うございます!私は本当にそれから多くを学びました!
ジェイソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.