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.


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

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


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)

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


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

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


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.


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)

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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.