web-dev-qa-db-ja.com

SQL Server-ブールリテラル?

SQL Serverでリテラルブール値を書く方法は?サンプルの使用を参照してください。

select * from SomeTable where PSEUDO_TRUE

別のサンプル:

if PSEUDO_TRUE
begin
  select 'Hello, SQL!'
end 

注:上記のクエリは、使用方法とは関係ありません。リテラルブール値をテストするだけです。

68
dpp

SQL Serverにはブール値 データ型 はありません。 @Mikaelが示したように、最も近い近似値はビットです。しかし、それは数値型であり、ブール型ではありません。さらに、0または1(および1つの非値、NULL)の2つの値のみをサポートします。

SQL(標準SQL、およびT-SQLダイアレクト)は、 つの値を持つロジック を記述します。 SQLのブール型は、TRUEFALSE、およびUNKNOWNの3つの値(および、値以外のNULL)をサポートする必要があります。このため、bitは実際にはここでは適切ではありません。

SQL Serverがデータ型をサポートしていないことを考えると、その「型」のリテラルを記述できるとは考えないでください。

67
select * from SomeTable where 1=1
36
nocache

Microsoft :によると、検索の構文は

[ WHERE <search_condition> ]*

検索条件は次のとおりです。

<search_condition> ::= 
    { [ NOT ] <predicate> | ( <search_condition> ) } 
    [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] 
[ ,...n ] 

述語は次のとおりです。

<predicate> ::= 
    { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression 

ご覧のとおり、alwaysは比較する2つの式を記述する必要があります。ここで、検索条件はboolean expression1 = 1、a!= b

検索式をboolean定数と混同しないでください 'True'または 'False'。ブール変数をBIT変数に割り当てることができます

DECLARE @B BIT
SET @B='True'

ただし、TSQLでは、次のようなブール式の代わりにブール定数を使用することはできません。

SELECT * FROM Somewhere WHERE 'True'

効果がないでしょう。

ただし、ブール定数を使用して、次のような両側検索式を作成できます。

SEARCH * FROM Somewhere WHERE 'True'='True' 
15
Dalex

これは、他のどの回答でも言及されていません。あなたが使用できるブール値として水和する(べき)値が必要な場合

CONVERT(bit、0)-false CONVERT(bit、1)-true

これにより、ブール値ではないビットが得られます。たとえば、ifステートメントでその値を使用することはできません。

IF CONVERT(bit, 0)
BEGIN
    print 'Yay'
END

woudlは解析されません。あなたはまだ書く必要があります

IF CONVERT(bit, 0) = 0

そのため、それほど便利ではありません。

15
Sam

ほとんどのデータベースはこれを受け入れます:

select * from SomeTable where true

ただし、一部のデータベース(SQL Server、Oracleなど)にはブール型がありません。これらの場合、次を使用できます。

select * from SomeTable where 1=1

ところで、SQLのwhere句を手動で作成する場合、これはコードを単純化するための基礎となります。where句に追加しようとしている条件がfirstであるかどうかを知る必要がないからです。 one("WHERE"を前に付ける必要があります)、または後続 one("AND"を前に置く必要があります)。常に"WHERE 1=1"で始まることにより、where句に追加されたすべての条件(存在する場合)の前に"AND"が付きます。

14
Bohemian

SQL Serverには、リテラルのtrueまたはfalse値はありません。まれに、これが必要な場合に1=1メソッド(または同様のメソッド)を使用する必要があります。

1つのオプションは、trueおよびfalseに対して独自の名前付き変数を作成することです

DECLARE @TRUE bit
DECLARE @FALSE bit
SET @TRUE = 1
SET @FALSE = 0

select * from SomeTable where @TRUE = @TRUE

ただし、これらはバッチのスコープ内にのみ存在します(それらを使用するすべてのバッチで再宣言する必要があります)

6
Daniel Renshaw

'TRUE'および'FALSE'を使用できます。 https://docs.Microsoft.com/en-us/sql/t-sql/data-types/bit-transact-sql から:

文字列値TRUEおよびFALSEはビット値に変換できます。TRUEは1に変換され、FALSEは0に変換されます。

4
Matt H

SQL Serverでリテラルブール値を書く方法は?
選択* PSEUDO_TRUEのSomeTableから

そのようなことはない。

= < > like ...を使用して値を何かと比較する必要があります。 SQL Serverでブール値を取得するのに最も近いのは bit です。そして、それはnull0および1の値を持つことができる整数です。

4
Mikael Eriksson

「真の値」は、1だけでなく0以外のすべてであると考える必要があります。したがって、1 = 1の代わりに1 <> 0と記述する必要があります。

パラメーター(@param <> 0)を使用すると、変換の問題が発生する可能性があるためです。

最も知られているのは、コントロールのTrue値を1ではなく-1として変換するAccessです。

2
Marco Guignard

TSQLでブール値を使用する価値について疑問を持っています。ブール値とforループを希望し始めるたびに、SQLプログラマーではなくCプログラマーのように問題に近づいていることに気付きました。ギアを切り替えたとき、問題は些細なものになりました。

SQLでは、データのセットを操作しています。 「WHERE BOOLEAN」は、使用しているセットを変更しないため、効果がありません。フィルタ句を有効にするには、各行を何かと比較する必要があります。 Table/Resultset is iEnumerable、SELECTステートメントis FOREACHループ。

はい、「WHERE IsAdmin = True」は「WHERE IsAdmin = 1」よりも読みやすいです

はい、TSQLを動的に生成する場合、「WHERE True」は「WHERE 1 = 1、...」よりも優れています。

また、ストアドプロシージャにブール値を渡すと、ifステートメントが読みやすくなる場合があります。

しかし、ほとんどの場合、TSQLにあるIF、WHILE、およびTempテーブルが多ければ多いほど、リファクタリングする可能性が高くなります。

1
David Lean

これが質問の意図に答えることを願っています。 SQL Serverにはブール値はありませんが、Accessから変換されたブール型を持つデータベースがある場合、Accessで機能するフレーズは "... WHERE Foo"(Fooはブール列名)です。 "... WHERE Foo <> 0"に置き換えることができます...これは動作します。幸運を!

1
den232