SQL Server'da sabit 1 veya 0 ile bit ima


154

Select deyiminde alan değeri olarak kullanıldığında 1 veya 0'ı bit olarak ifade etmek mümkün müdür?

Örneğin

Bu durumda deyim (bir select deyiminin parçasıdır) ICourseBased int türündedir.

case 
when FC.CourseId is not null then 1
else 0
end
as IsCoursedBased

Biraz tip olması için her iki değeri de kullanmalıyım.

case 
when FC.CourseId is not null then cast(1 as bit)
else cast(0 as bit)
end
as IsCoursedBased

Değerleri her seferinde yayınlamak zorunda kalmadan bit tipi olarak ifade etmenin kısa bir yolu var mı?

(MS SQL Server 2005 kullanıyorum)

Yanıtlar:


226
cast (
  case
    when FC.CourseId is not null then 1 else 0
  end
as bit)

CAST spesifikasyonu "CAST (ifade AS tipi)" dir. CASE bu bağlamda bir ifadedir .

Bu tür birden çok ifadeniz varsa, bit var @true ve @false bildirir ve bunları kullanırdım. Veya gerçekten isterseniz UDF'leri kullanın ...

DECLARE @True bit, @False bit;
SELECT @True = 1, @False = 0;  --can be combined with declare in SQL 2008

SELECT
    case when FC.CourseId is not null then @True ELSE @False END AS ...

1
Bir nit, 5. satırda "başka 0" olmalıdır.
Shannon Severance

1
Kodu daha okunabilir hale getirmek için SQL'imizi standartlaştırdık ve true / false ifadesini ifade etmemiz gerektiğinde bildirilen bit değişkenlerini kullanıyoruz.
Damien McGivern

@Damien McGivern: Çok fazla CAST'im olduğunda da yararlı buldum
gbn

10

İkinci snippet'i bir görünümde ICourseBased için alan tanımı olarak ekleyebilirsiniz.

DECLARE VIEW MyView
AS
  SELECT
  case 
  when FC.CourseId is not null then cast(1 as bit)
  else cast(0 as bit)
  end
  as IsCoursedBased
  ...

SELECT ICourseBased FROM MyView

Bu çalışır, ancak cast () bir NULL türü döndüren dezavantajı vardır.
Dan

6

Hayır, ancak bu ifadenin alt bileşenleri yerine tüm ifadeyi yayınlayabilirsiniz. Aslında, bu muhtemelen bu durumda daha az okunabilir hale getirir .


4

GBN'lerden biraz daha yoğun:

CourseIdSıfır olmadığını varsayarsak

CAST (COALESCE(FC.CourseId, 0) AS Bit)

COALESCE, bir gibidir ISNULL(), ancak ilk Null olmayanı döndürür.

Sıfır olmayan CourseIdbir CourseIdöğe 1'e tür atışı alırken, null değeri COALESCE öğesinin bir sonraki değeri (0) döndürmesine neden olur


4

Sütunun BIT ve NOT NULL olmasını istiyorsanız, CAST'den önce ISNULL yazmanız gerekir.

ISNULL(
   CAST (
      CASE
         WHEN FC.CourseId IS NOT NULL THEN 1 ELSE 0
      END
    AS BIT)
,0) AS IsCoursedBased

1

Ne yazık ki hayır. Her bir değeri ayrı ayrı yayınlamanız gerekir.


0

SELECT içinde kullanılacak ifade olabilir

CAST(IIF(FC.CourseId IS NOT NULL, 1, 0) AS BIT)

Bu yanıtı daha kullanışlı hale getirin ve açıklayın veya kütüphane / dokümanlara bağlantılar sağlayın
happymacarts

Merhaba, ve SO'ya hoş geldiniz. Lütfen cevabınızı açıklayınız.
Chait

Her ne kadar IIF daha iyi görünüyor case when ... else ... end, biri hala döküm zorundadır 1ve 0BIT tipine.
Fabio A.

-1

Keyfini çıkarın :) Her değeri ayrı ayrı dökmeden.

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
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.