บิตที่มีค่าคงที่ 1 หรือ 0 ใน SQL Server


154

เป็นไปได้ไหมที่จะแสดง 1 หรือ 0 เป็นบิตเมื่อใช้เป็นค่าฟิลด์ในคำสั่ง select?

เช่น

ในคำสั่งกรณีนี้ (ซึ่งเป็นส่วนหนึ่งของคำสั่งที่เลือก) ICourseBased เป็นประเภท int

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

เพื่อให้เป็นประเภทบิตฉันต้องโยนค่าทั้งสอง

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

มีวิธีสั้น ๆ ในการแสดงค่าเป็น bit type โดยไม่ต้องร่ายทุกครั้งหรือไม่?

(ฉันใช้ MS SQL Server 2005)

คำตอบ:


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

CAST spec คือ "CAST (expression AS type)" CASE คือนิพจน์ในบริบทนี้

หากคุณมีการแสดงออกหลายอย่างฉันจะประกาศ bit vars @true และ @false และใช้ หรือใช้ UDF ถ้าคุณต้องการจริงๆ ...

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
Nit ควรเป็น "else 0" ในบรรทัดที่ 5
Shannon Severance

1
เพื่อให้โค้ดอ่านง่ายขึ้นเราได้สร้างมาตรฐาน SQL ของเราและตอนนี้ใช้ตัวแปรบิตที่ประกาศเมื่อเราต้องการแสดงความจริง / เท็จ
Damien McGivern

@ Damien McGivern: ฉันคิดว่ามันมีประโยชน์เหมือนกันเมื่อฉันมีนักแสดงหลายคน
gbn

10

คุณอาจเพิ่มตัวอย่างที่สองเป็นคำจำกัดความของฟิลด์สำหรับ ICourseBased ในมุมมอง

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

ใช้งานได้ แต่มีข้อเสียที่ cast () ส่งคืนชนิด NULL
Dan

6

ไม่ แต่คุณสามารถใช้นิพจน์ทั้งหมดแทนส่วนประกอบย่อยของนิพจน์นั้นได้ ที่จริงแล้วอาจทำให้อ่านได้น้อยลงในกรณีนี้


4

ข้นน้อยกว่า gbn เล็กน้อย:

สมมติว่าCourseIdไม่ใช่ศูนย์

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

COALESCEเป็นเหมือนISNULL()แต่ส่งกลับไม่ใช่ค่า Null แรก

Non-Zero CourseIdจะพิมพ์ค่าเป็น 1 ในขณะที่ค่า null CourseIdจะทำให้ COALESCE ส่งคืนค่าถัดไป 0


4

หากคุณต้องการให้คอลัมน์เป็น BIT และไม่ใช่ NULL คุณควรใส่ ISNULL หน้า CAST

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


0

นิพจน์ที่ใช้ภายใน SELECT อาจเป็นได้

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

ทำให้คำตอบนี้มีประโยชน์มากขึ้นและอธิบายหรือให้ลิงก์ไปยังห้องสมุด / เอกสาร
happymacarts

สวัสดีและยินดีต้อนรับสู่ SO กรุณาอธิบายคำตอบของคุณ
Chait

แม้ว่าIIFจะดูดีกว่าcase when ... else ... endแต่ก็ยังมีการส่ง1และ0ประเภท BIT
Fabio A.

-1

สนุกไปกับมัน :) โดยไม่ต้องทิ้งแต่ละค่า

SELECT ...,
  IsCoursedBased = CAST(
      CASE WHEN fc.CourseId is not null THEN 1 ELSE 0 END
    AS BIT
  )
FROM fc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.