SQL Select Deyiminde Boole Değeri


144

SQL Select deyiminde bir Boole değeri nasıl döndürülür?

Bu kodu denedim:

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

Ve sadece döner TRUEeğer UserIDmasanın üzerinde bulunmaktadır. Ben dönmek istiyorum FALSEeğer UserIDmasada yok.


3
Hangi dbms? Sql detayları farklı.
Joshp

SQL Server bir Boolean türünü desteklemez, örneğin SELECT WHEN CAST(1 AS BIT) THEN 'YES' END AS resultbir hata ile sonuçlanır, yani CAST(1 AS BIT)aynı mantıksal DOĞRU değildir.
oneday30

Yanıtlar:


253

Eğer orada yoksa, kullanıcı yoksa hiçbir satır döndürmez. İhtiyacınız olan şey:

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

2
neden yıldız işareti kullanırsanız, 1yerine kullanmak daha iyidir *.

7
@ robertpeter07 - İkisi eşdeğer, ancak *daha deyimsel. Bu soruya bakın .
Çad

Bir WHILE döngüsünde kullanacak olursam, bunu 'WHILE' den hemen sonra {} diş telleri içine eklemeliyim?
full_prog_full

Döndürülen değere bir sütun adı ekleyebilir misiniz?
xMetalDetectorx

3
@xMetalDetectorx Bu sütun adını eklemek benim için çalıştı ( AS boolbölüm çok önemlidir):CAST( CASE WHEN EXISTS ( SELECT * FROM mytable WHERE mytable.id = 1) THEN TRUE ELSE FALSE END AS bool) AS nameofmycolumn
Lucio Mollinedo


22

Genelde 1 = trueve 0 = falsetek yapmanız gereken satır sayısını saymak ve a'ya atmaktır boolean.

Bu nedenle, yayınlanan kodunuzda yalnızca bir COUNT()işlev eklendi:

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

8
Exists(Testi yapmak , çok Count(1)sayıda satırı olan tablolarda test yapmaktan çok daha hızlıdır .
Scott Chamberlain

5
Muhtemelen. Cevabımda performansla ilgili herhangi bir iddiada bulunmadım, sadece OP'nin istediğini elde etmek için minimum kod değişikliği. Ancak, sütun UserIDdizine eklenmişse (veya PK ise), elbette var olan ya da olmayan tek bir satıra doğrudan gidersiniz.
Stewart

9

0 veya 1 değerini döndüren 'Varolanlar'ı kullanın.

Sorgu aşağıdaki gibi olacaktır:

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

10
Hata: "'EXISTS' anahtar kelimesinin yanında yanlış sözdizimi." sqlfiddle.com/#!18/ef905/18
JoePC

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

Count (*) = 0 ise false değerini döndürür. Count (*)> 0 ise true değerini döndürür.


4

Bunu şöyle yaparım:

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

Bir boole olarak görmek asla boş olamaz (en azından .NET'te), varsayılan olarak false değerine ayarlanmalı veya varsayılanı true olarak ayarlanmışsa kendiniz ayarlayabilirsiniz. Ancak 1 = true, yani null = false ve ekstra sözdizimi yok.

Not: Dapper'ı mikro orm olarak kullanıyorum, ADO'nun aynı şekilde çalışması gerektiğini düşünürdüm.


Şimdiye kadar en sevdiğim, en özlü cevabım. Tüm cevapların kemanı
JoePC

"Bir boolean olarak görmek asla boş olamaz (en azından .NET'te)." (bool?) boş bir bool'dur.
Andrew Dennison

1

Eşdeğer başka bir soruna dikkat edin: Koşul yerine getirildiğinde (1) ve aksi durumda boş bir sonuç döndüren bir SQL sorgusu oluşturma. Bu soruna bir çözümün daha genel olduğuna ve sorduğunuz soruyu elde etmek için yukarıdaki cevaplarla kolayca kullanılabileceğine dikkat edin. Bu sorun daha genel olduğu için, sorununuza yukarıda sunulan güzel çözümlere ek olarak çözümünü de kanıtlıyorum.

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

1

Özel bir sütun adı eklemeye değer almak isteyenleriniz için bu benim için çalıştı:

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

Adın büyük / küçük harf duyarlılığını korumak istemiyorsanız, çift tırnak işaretlerini sütun adından atlayabilirsiniz (bazı istemcilerde).

@ Chad'in bunun cevabını hafifçe değiştirdim.


Msg 102, Seviye 15, Durum 1, Satır 8 'CAST' yakınında yanlış sözdizimi. Msg 156, Seviye 15, Durum 1, Satır 12 'THEN' anahtar kelimesinin yanında yanlış sözdizimi.
ShaneC

@ShaneC Bu kodu PostgreSQL 9.X üzerinde test ettim ve işe yaradı. Hangi sunucuyu kullanıyorsunuz?
Lucio Mollinedo

0
DECLARE @isAvailable      BIT = 0;

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

Kullanılabilir boole değeri 0 olarak ayarlanmış

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.