これはSQLでブールテストを行うための適切な方法ですか?


81

アクティブが「ブールフィールド」(0または1の小さなint)であると想定します。

# Find all active users
select * from users where active 

# Find all inactive users
select * from users where NOT active 

つまり、「NOT」演算子をブールフィールドに直接適用できますか?


はい、投稿されたように、ブールフィールドは通常「int」ではなく「bit」と入力されます
Davis

「active = 0」が可能な回避策であることを間違いなく知っているので、あなたは本当に見栄えの良いコードを求めていると思います。「NOTactive」と「active = 0」のどちらを選択しても、気になりません。どうしても説明が必要な場合は、コメントを追加してください。(将来、コードを操作する人がtrue / false <-> 1/0の関係を理解できない場合は、誰かがあなたのコードに触れてはいけないかもしれません...)
Tomas Aschan 2009年

1
@Eric:SQLでは、述語はブール結果を生成する必要があります。「アクティブな場所」はそのような結果を生成しません。これは、「アクティブ」がBITデータ型であったとしても(BITはブール値ではなく、範囲が0..1の整数値であるため)です。したがって、ブール値を生成するには、ある種の比較を行う必要あります。「whereNOT(active = 1)」は機能しますが、「whereNOTactive」は機能しません。
Tomalak 2009年

Tomalak-あなたはそのコメントを答えとして投稿すべきでした!
womp 2009年

@Tomalak:「SQLでは、述語はブール結果を生成する必要があります」-完全ではありません。SQLは、TRUE、FALSE、およびUNKNOWNの3つの値論理を示します(「アクティブ」はNULLになる可能性があることを考慮してください)。
onedaywhen

回答:


88

SQLのブール値はビットフィールドです。これは、1または0のいずれかを意味します。正しい構文は次のとおりです。

select * from users where active = 1 /* All Active Users */

または

select * from users where active = 0 /* All Inactive Users */

14
@ JoseBasilio- PostgreSQLを除く:postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin

ほとんどのDBでは、フィールドをNULLにすることもできます。アクティブフィールドのデフォルト値でテーブルを設定しない場合は、NULLもチェックする必要がある場合があります。
IAmNaN 2014

Rails(4)内でSQLiteを使用して、「f」または「t」を使用してクエリを実行しました(ただし、文字としてではありません)。上記のクエリを使用すると、機能しませんでした。しかし:SELECT “model".* FROM “model" WHERE “boolean_column" = ‘f'働いた
Stefan Hendriks 2014年

25

Postgresを使用すると、

select * from users where active

または

select * from users where active = 't'

整数値を使用する場合は、それを文字列と見なす必要があります。整数値は使用できません。

select * from users where active = 1   -- Does not work

select * from users where active = '1' -- Works 

それが真か真か1かを見つけるために
全体を見渡した

4
+1 PostgreSQLブールオプションの詳細:postgresql.org/docs/9.1/static/datatype-boolean.html
Yarin 2014年

1
Aslo、PosgtresはOPの構文を受け入れます:where activewhere not active。参照してくださいpostgresql.org/docs/8.2/static/functions-logical.html
ロイックFaugeron

13

MS SQL 2008は、trueまたはfalseの文字列バージョンを使用することもできます...

select * from users where active = 'true'
-- or --
select * from users where active = 'false'

うわー、それはクールです...私はうまくいくとは思いもしませんでしたが、私のテストから2008年以降は間違いなくうまくいきます。
Maxim Gershkovich 2017年

12

SQL Serverでは、一般的に使用します。他のデータベースエンジンについては知りません。

select * from users where active = 0

3

個人的には、ブール値のネイティブ型を持たないデータベースには、値が「Y」および「N」のchar(1)を使用することを好みます。文字は、1が真に対応し、0が偽に対応するようになったと想定する数字よりもユーザーフレンドリーです。

(N)Hibernateを使用すると、「Y」と「N」も適切にマップされます。



-1

SQLite3を使用している場合は、次の点に注意してください。

't'または 'f'のみかかります。1または0ではありません。TRUEまたはFALSEではありません。

難しい方法を学びました。


1
本当じゃない。dev.mysql.com/doc/refman/8.0/en/numeric-type-overview.html:「これらのタイプはTINYINT(1)の同義語です。ゼロの値はfalseと見なされます。ゼロ以外の値はtrueと見なされます」。
モリッツ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.