SQL Selectステートメントでブール値を返す


144

SQL Selectステートメントでブール値を返す方法は?

私はこのコードを試しました:

SELECT CAST(1 AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)

そして、テーブルにが存在するTRUE場合にのみ戻りUserIDます。テーブルに存在しないFALSE場合に返してほしいUserID


3
どのdbms?SQLの詳細は異なります。
joshp 2012

SQL Serverはブール型をサポートしていません。たとえばSELECT WHEN CAST(1 AS BIT) THEN 'YES' END AS result、エラーになります。つまりCAST(1 AS BIT)、同じ論理TRUEではありません。
2012

回答:


253

ユーザーが存在しない場合、そこにあるものは行をまったく返しません。必要なものは次のとおりです。

SELECT CASE WHEN EXISTS (
    SELECT *
    FROM [User]
    WHERE UserID = 20070022
)
THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT) END

2
アスタリスクを使用する理由は、の1代わりに使用することをお勧めします*

7
@ robertpeter07-2つは同等ですが*、より慣用的です。この質問を参照してください。
チャド

WHILEループで使用する場合、 'WHILE'の直後に中括弧{}で囲む必要がありますか?
full_prog_full 2016年

戻り値に列名を追加できますか?
xMetalDetectorx 2017年

3
@xMetalDetectorxこれは、(列名を追加するために私のために働いたAS bool部分は非常に重要です):CAST( CASE WHEN EXISTS ( SELECT * FROM mytable WHERE mytable.id = 1) THEN TRUE ELSE FALSE END AS bool) AS nameofmycolumn
ルシオMollinedo

31

おそらくこれらの線に沿った何か:

SELECT CAST(CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END AS BIT)
FROM dummy WHERE id = 1;

http://sqlfiddle.com/#!3/5e555/1


6
これはブール値ではなく文字列を返します
OMG Ponies

列名を含めることをお勧めします-SELECT CAST(CASE WHEN COUNT(*)> 0 THEN 1 ELSE 0 END AS BIT)as mycolumnname FROM dummy WHERE id = 1
Diego Alves

22

これが一般的に1 = true0 = falseであることを考えると、行数を数え、にキャストするだけbooleanです。

したがって、投稿されたコードにはCOUNT()関数を追加するだけで済みます。

SELECT CAST(COUNT(1) AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)

8
やってExists(テストすることは非常に速く行うよりもあるCount(1)の行数が多いテーブルの上にテストを。
スコットチェンバレン

5
恐らく。私の回答では、パフォーマンスに対する主張はしていません。OPが望むものを達成するための最小限のコード変更だけです。ただし、列UserIDにインデックスが付けられている(またはPKでさえある)場合、確かに存在する(または存在しない)1つの一意の行に直接移動します。
スチュワート

9

0または1を返す 'Exists'を使用します。

クエリは次のようになります。

SELECT EXISTS(SELECT * FROM USER WHERE UserID = 20070022)

10
エラー:「キーワード 'EXISTS'の近くに不正な構文があります。」sqlfiddle.com/#!18/ef905/18
JoePC

8
select CAST(COUNT(*) AS BIT) FROM [User] WHERE (UserID = 20070022)

count(*)= 0の場合、falseを返します。count(*)> 0の場合、trueを返します。


4

私はそれをこのようにします:

SELECT 1 FROM [dbo].[User] WHERE UserID = 20070022

(少なくとも.NETでは)ブール値をnullにすることはできません。デフォルトでfalseにする必要があります。デフォルトでtrueになっている場合は、それを自分で設定できます。ただし、1 = true、null = false、追加の構文はありません。

注:私はマイクロオームとしてDapperを使用しています。ADOは同じように動作するはずです。


これまでのところ、私のお気に入り、最も簡潔な答え。すべての回答のフィドル:sqlfiddle.com
#!

「(少なくとも.NETでは)ブール値としてnullになることはありません。」(bool?)はnull許容のboolです。
アンドリューデニソン

1

別の同等の問題に注意してください。条件が満たされている場合は(1)を返し、そうでない場合は空の結果を返すSQLクエリを作成します。この問題の解決策はより一般的であり、上記の回答とともに簡単に使用して、質問した問題を解決できることに注意してください。この問題はより一般的であるため、上記の美しい解決策に加えて、私はその解決策を証明しています。

SELECT DISTINCT 1 AS Expr1
FROM [User]
WHERE (UserID = 20070022)

1

カスタム列名を追加して値を取得することに興味がある人のために、これは私にとってうまくいきました:

CAST(
    CASE WHEN EXISTS ( 
           SELECT * 
           FROM mytable 
           WHERE mytable.id = 1
    ) 
    THEN TRUE 
    ELSE FALSE 
    END AS bool) 
AS "nameOfMyColumn"

(一部のクライアントでは)名前の大文字と小文字を区別する必要がない場合は、列名から二重引用符をスキップできます。

@Chadの答えを少し微調整しました。


メッセージ102、レベル15、状態1、行8「CAST」付近の構文が正しくありません。メッセージ156、レベル15、状態1、行12キーワード 'THEN'の近くの構文が正しくありません。
ShaneC

@ShaneC PostgreSQL 9.Xでこのコードをテストしましたが、問題なく動作しました。どのサーバーを使用していますか?
Lucio Mollinedo

0
DECLARE @isAvailable      BIT = 0;

IF EXISTS(SELECT 1  FROM [User] WHERE (UserID = 20070022))
BEGIN
 SET @isAvailable = 1
END

最初はisAvailableブール値は0に設定されています

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.