Mengimplikasikan bit dengan konstanta 1 atau 0 di SQL Server


154

Apakah mungkin untuk menyatakan 1 atau 0 sedikit ketika digunakan sebagai nilai bidang dalam pernyataan pilih?

misalnya

Dalam hal ini pernyataan (yang merupakan bagian dari pernyataan pilih) ICourseBased adalah tipe int.

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

Untuk membuatnya menjadi tipe bit saya harus memberikan kedua nilai.

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

Apakah ada cara singkat untuk mengekspresikan nilai sebagai tipe bit tanpa harus melakukan cast setiap waktu?

(Saya menggunakan MS SQL Server 2005)

Jawaban:


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

Spesifikasi CAST adalah "CAST (tipe ekspresi AS)". KASUS adalah ekspresi dalam konteks ini.

Jika Anda memiliki beberapa ekspresi seperti itu, saya akan mendeklarasikan bit vars @true dan @false dan menggunakannya. Atau gunakan UDF jika Anda benar-benar ingin ...

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
A nit, harus "selain 0" pada jalur 5.
Shannon Severance

1
Untuk membuat kode lebih mudah dibaca, kita menstandarisasi SQL kita dan sekarang menggunakan variabel bit yang dideklarasikan ketika kita perlu mengekspresikan true / false.
Damien McGivern

@Damien McGivern: Saya merasa berguna juga ketika saya memiliki banyak CAST
gbn

10

Anda dapat menambahkan potongan kedua sebagai definisi bidang untuk ICourseBased dalam tampilan.

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

Ini berfungsi, tetapi memiliki sisi negatif yang memberikan () mengembalikan tipe NULL.
Dan

6

Tidak, tetapi Anda bisa menggunakan seluruh ekspresi daripada sub-komponen dari ekspresi itu. Sebenarnya, itu mungkin membuatnya kurang mudah dibaca dalam kasus ini.


4

Sedikit lebih padat daripada gbn:

Dengan asumsi CourseIdtidak nol

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

COALESCEseperti ISNULL(), tetapi mengembalikan non-Null pertama.

Non-Zero CourseIdakan mendapatkan tipe-cast ke 1, sedangkan nol CourseIdakan menyebabkan COALESCE mengembalikan nilai berikutnya, 0


4

Jika Anda ingin kolom BIT dan BUKAN NULL, Anda harus meletakkan ISNULL sebelum CAST.

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

1

Sayangnya tidak ada. Anda harus memberikan setiap nilai secara individual.


0

Ekspresi yang digunakan dalam SELECT bisa berupa

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

Jadikan jawaban ini lebih bermanfaat dan jelaskan atau berikan tautan ke perpustakaan / dokumen
happymacarts

Halo, dan selamat datang di SO. Tolong jelaskan jawaban Anda.
Chait

Meskipun IIF terlihat lebih baik daripada case when ... else ... end, kita masih harus menggunakan 1dan 0untuk tipe BIT.
Fabio A.

-1

Nikmati ini :) Tanpa memberikan setiap nilai secara individual.

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