Kembalikan Nilai Boolean pada Pernyataan Pilih SQL

144

Bagaimana mengembalikan nilai boolean pada SQL Select Statement?

Saya mencoba kode ini:

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

Dan itu hanya kembali TRUEjika UserIDada di atas meja. Saya ingin mengembalikan FALSEjika UserIDtidak ada di atas meja.

mrjimoy_05
sumber
3
Dbms yang mana? Detail sql berbeda.
joshp
SQL Server tidak mendukung tipe Boolean misalnya SELECT WHEN CAST(1 AS BIT) THEN 'YES' END AS result- menghasilkan kesalahan yaitu CAST(1 AS BIT)tidak BENAR logis yang sama.
onedaywhen

Jawaban:

253

Apa yang Anda miliki di sana tidak akan mengembalikan baris sama sekali jika pengguna tidak ada. Inilah yang Anda butuhkan:

SELECT CASE WHEN EXISTS (
    SELECT *
    FROM [User]
    WHERE UserID = 20070022
)
THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT) END
Chad
sumber
2
mengapa menggunakan asterisk, lebih baik jika Anda menggunakan 1bukan *.
7
@ robertpeter07 - Keduanya setara, tetapi *lebih idiomatis. Lihat pertanyaan ini .
Chad
Jika menggunakan pada WHILE loop saya harus melampirkannya di dalam kurung {} tepat setelah 'WHILE'?
full_prog_full
Bisakah Anda menambahkan nama kolom ke nilai yang dikembalikan?
xMetalDetectorx
3
@xMetalDetectorx Ini berhasil bagi saya untuk menambahkan nama kolom ( AS boolbagian ini sangat penting):CAST( CASE WHEN EXISTS ( SELECT * FROM mytable WHERE mytable.id = 1) THEN TRUE ELSE FALSE END AS bool) AS nameofmycolumn
Lucio Mollinedo
31

Mungkin ada sesuatu di sepanjang baris ini:

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

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

cableload
sumber
6
Ini mengembalikan string, bukan boolean
OMG Ponies
Ini adalah praktik yang baik untuk memasukkan nama kolom - SELECT CAST (KASUS KETIKA COUNT (*)> 0 KEMUDIAN 1 ELSE 0 AKHIR BIT) sebagai mycolumnname DARI dummy WHERE id = 1
Diego Alves
22

Mengingat bahwa secara umum 1 = truedan 0 = false, yang perlu Anda lakukan adalah menghitung jumlah baris, dan dilemparkan ke a boolean.

Karenanya, kode Anda yang diposting hanya perlu COUNT()fungsi yang ditambahkan:

SELECT CAST(COUNT(1) AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)
Stewart
sumber
8
Melakukan Exists(tes jauh lebih cepat daripada melakukan Count(1)tes di atas meja dengan banyak baris.
Scott Chamberlain
5
Mungkin. Saya tidak mengklaim kinerja dalam jawaban saya, hanya perubahan kode minimal untuk mencapai apa yang diinginkan OP. Namun, jika kolom UserIDdiindeks (atau bahkan PK) pasti Anda akan langsung ke satu baris unik yang ada (atau tidak).
Stewart
9

Gunakan 'Ada' yang mengembalikan 0 atau 1.

Kueri akan seperti:

SELECT EXISTS(SELECT * FROM USER WHERE UserID = 20070022)
Ananthi
sumber
10
Kesalahan: "Sintaksis salah di dekat kata kunci 'EXISTS'." sqlfiddle.com/#!18/ef905/18
JoePC
8
select CAST(COUNT(*) AS BIT) FROM [User] WHERE (UserID = 20070022)

Jika hitung (*) = 0 menghasilkan false. Jika hitung (*)> 0 mengembalikan true.

G. Noula
sumber
4

Saya melakukannya seperti ini:

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

Melihat sebagai boolean tidak pernah bisa menjadi nol (setidaknya dalam. NET), itu harus default ke false atau Anda dapat mengaturnya sendiri jika defaultnya benar. Namun 1 = benar, jadi null = salah, dan tidak ada sintaks tambahan.

Catatan: Saya menggunakan Dapper sebagai mikro saya, saya akan membayangkan ADO harus bekerja sama.

RandomUs1r
sumber
Jawaban favorit saya, yang paling ringkas sejauh ini. Fiddle dari semua jawaban: sqlfiddle.com/#!18/ef905/18
JoePC
"Melihat sebagai boolean tidak pernah bisa menjadi nol (setidaknya dalam. NET)." (bool?) adalah bool nullable.
Andrew Dennison
1

Perhatikan masalah lain yang setara: Membuat kueri SQL yang mengembalikan (1) jika kondisi terpenuhi dan hasil kosong sebaliknya. Perhatikan bahwa solusi untuk masalah ini lebih umum dan dapat dengan mudah digunakan dengan jawaban di atas untuk mencapai pertanyaan yang Anda ajukan. Karena masalah ini lebih umum, saya membuktikan solusinya selain solusi indah yang disajikan di atas untuk masalah Anda.

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

Bagi Anda yang tertarik untuk mendapatkan nilai dengan menambahkan nama kolom khusus, ini berhasil bagi saya:

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

Anda dapat melewati tanda kutip ganda dari nama kolom jika Anda tidak tertarik menjaga sensitivitas huruf besar-kecilnya nama (pada beberapa klien).

Saya sedikit mengutak-atik jawaban Chad untuk ini.

Lucio Mollinedo
sumber
Msg 102, Level 15, State 1, Line 8 Sintaks salah dekat 'CAST'. Msg 156, Level 15, Negara 1, Baris 12 Sintaks salah di dekat kata kunci 'THEN'.
ShaneC
@ShaneC Saya menguji kode ini pada PostgreSQL 9.X dan bekerja dengan baik. Server apa yang Anda gunakan?
Lucio Mollinedo
0
DECLARE @isAvailable      BIT = 0;

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

awalnya adalah nilai boolean yang tersedia diatur ke 0

Chamin Thilakarathne
sumber