เป็นไปได้ไหมที่จะเลือก EXISTS เป็นบิตโดยตรง


186

ฉันสงสัยว่าเป็นไปได้ไหมที่จะทำสิ่งนี้ (ซึ่งไม่ได้ผล):

select cast( (exists(select * from theTable where theColumn like 'theValue%') as bit)

ดูเหมือนว่ามันควรจะเป็นไปได้ แต่สิ่งต่าง ๆ ที่ควรจะทำงานใน SQL ไม่ได้;) ฉันเคยเห็นวิธีแก้ปัญหาสำหรับเรื่องนี้ (เลือก 1 ที่ ... มีอยู่ ... ) แต่ดูเหมือนว่าฉันควรจะสามารถทำได้ ส่งผลของฟังก์ชั่นที่มีอยู่เป็นบิตและทำได้ด้วย

คำตอบ:


267

ไม่ได้คุณจะต้องใช้วิธีแก้ปัญหา

หากคุณต้องส่งคืนบิตเงื่อนไข 0/1 อีกวิธีหนึ่งคือ:

SELECT CAST(
   CASE WHEN EXISTS(SELECT * FROM theTable where theColumn like 'theValue%') THEN 1 
   ELSE 0 
   END 
AS BIT)

หรือไม่มีนักแสดง:

SELECT
   CASE
       WHEN EXISTS( SELECT 1 FROM theTable WHERE theColumn LIKE 'theValue%' )
            THEN 1 
       ELSE 0 
   END

16
คุณไม่ต้องการนักแสดงหากคุณเก็บผลลัพธ์ลงในประเภทข้อมูลบิตเนื่องจากการส่งนั้นมีความชัดเจนอยู่แล้ว
MikeTeeVee

3
เพิ่งทดสอบเทคนิคนี้ใช้งานได้ดี CAST to BIT ไม่จำเป็นต้องดึงผลลัพธ์จากแบบสอบถามทดสอบด้วย SQL Server 2008 R2
Tore Aurstad

ในกรณีของฉันนักแสดงต้องลบออก
Sérgio S. Filho

51
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'

เมื่อคุณร่ายบิต

  • 0 -> 0
  • ทุกอย่างอื่น -> 1
  • และ NULL -> NULL แน่นอน แต่คุณไม่สามารถรับ NULL ด้วย COUNT (*) หากไม่มี GROUP BY

bitแผนที่โดยตรงไปยังbooleanในประเภทข้อมูลสุทธิแม้ว่ามันจะไม่ได้จริงๆ ...

สิ่งนี้มีลักษณะคล้ายกัน แต่ไม่ให้แถว (ไม่เป็นศูนย์) หากไม่มีข้อมูลตรงกันดังนั้นจึงไม่เหมือนกัน

SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%'

4
แต่นี่ไม่ได้ใช้ EXISTS เลย ฉันไม่ได้ถามวิธีแก้ปัญหาฉันสามารถหาวิธีแก้ปัญหาได้ฉันถูกถามว่ามีเคล็ดลับในการใช้อยู่บ้างเล็กน้อยที่ฉันไม่ทราบหรือไม่
jcollum

6
นี่ไม่ใช่วิธีแก้ปัญหามันเป็นวิธีที่ถูกต้องในการตั้งค่า EXISTS เป็นวิธีแก้ปัญหานี้ ... และสะอาดมากใช่ไหม
gbn

1
@jcollum: ใช่หรืออะไรแบบนี้ EXISTS เกือบทุกครั้งถ้า EXISTS หรือที่ไหน EXISTS และไม่ได้ใช้สำหรับการส่งออกเหมือนที่คุณพยายามจะทำ
gbn

14
EXISTS มีประสิทธิภาพมากกว่า COUNT เมื่อตรวจสอบการมีอยู่ของบันทึก - ดูsqlblog.com/blogs/andrew_kelly/archive/2007/12/15/ …
Tahir Hassan

9
ซึ่งแตกต่างจากEXISTS, COUNTจะให้มองในข้อมูลสำหรับแถวจับคู่แม้หลังจากพบครั้งแรกหนึ่งเพราะความต้องการที่จะได้รับการนับ
IsmailS

11

ฉันจะสายในการรับนี้ เพิ่งสะดุดข้ามโพสต์ อย่างไรก็ตามนี่เป็นวิธีแก้ปัญหาที่มีประสิทธิภาพมากกว่า & ประณีตกว่าคำตอบที่เลือก แต่ควรให้ฟังก์ชั่นเดียวกัน:

declare @t table (name nvarchar(16))
declare @b bit

insert @t select N'Simon Byorg' union select N'Roe Bott'


select @b = isnull((select top 1 1 from @t where name = N'Simon Byorg'),0)
select @b whenTrue

select @b = isnull((select top 1 1 from @t where name = N'Anne Droid'),0)
select @b whenFalse

7

คุณสามารถใช้IIFและCAST

SELECT CAST(IIF(EXISTS(SELECT * FROM theTable 
                       where theColumn like 'theValue%'), 1, 0) AS BIT)

1
ฉันชอบสิ่งนี้ แต่ใช้งานได้ใน SQL Server 2012 ขึ้นไปเท่านั้น ดูเหมือนว่าจะมีการเพิ่ม IIF ในปี 2012
ja928

5

คุณยังสามารถทำสิ่งต่อไปนี้:

SELECT DISTINCT 1
  FROM theTable
 WHERE theColumn LIKE 'theValue%'

หากไม่มีค่าที่ขึ้นต้นด้วย 'theValue' สิ่งนี้จะคืนค่า null (ไม่มีเรคคอร์ด) แทนที่จะเป็นบิต 0


2

ไม่เป็นไปไม่ได้ ชนิดข้อมูลบิตไม่ใช่ชนิดข้อมูลบูลีน มันเป็นชนิดข้อมูลจำนวนเต็มที่สามารถเป็น 0,1 หรือ NULL


3
@bzlm ใช่แล้วใน SQLServer นานกว่า 10 ปี SQL Server 7.0 แนะนำให้ใช้msdn.microsoft.com/en-us/library/aa237157%28SQL.80%29.aspx
Martin Smith

4
@bzlm - ดูเหมือนว่าคุณกำลังกำหลอดฟางและไม่รู้อะไรเลยเกี่ยวกับประเภทข้อมูล SQL Server สำหรับฉัน คำจำกัดความของบิตใน SQL Server คือ "ชนิดข้อมูลจำนวนเต็มที่สามารถรับค่า 1, 0 หรือ NULL ได้" msdn.microsoft.com/en-us/library/ms177603.aspx สิ่งนี้ใช้กับคอลัมน์และตัวแปร Transact SQL ตัวแปรบิตสามารถใช้เป็นบูลีนใน SQL ได้IF(@TRUE)เช่นกันและไม่สามารถบังคับนิพจน์บูลีนให้กลายเป็นบิตได้ (ด้วยเช่นSET @BitVariable = (1=1))
Martin Smith

1
ฉันเห็นว่าคุณกำลังจะไปที่ไหน
jcollum


-1

ฉันเชื่อว่ามีอยู่สามารถใช้งานได้ในส่วนคำสั่งเท่านั้นดังนั้นคุณจะต้องแก้ปัญหา (หรือแบบสอบถามย่อยที่มีอยู่เป็นข้อที่) ฉันไม่รู้ว่านับว่าเป็นวิธีแก้ปัญหาหรือไม่

เกี่ยวกับสิ่งนี้:

create table table1 (col1   int null)
go
select 'no items',CONVERT(bit, (select COUNT(*) from table1) )   -- returns 'no items', 0
go
insert into table1 (col1) values (1)
go
select '1 item',CONVERT(bit, (select COUNT(*) from table1) )     --returns '1 item', 1
go
insert into table1 (col1) values (2)
go
select '2 items',CONVERT(bit, (select COUNT(*) from table1) )    --returns '2 items', 1
go
insert into table1 (col1) values (3)
go
drop table table1
go

สิ่งที่เกี่ยวกับกรณีที่เมื่อเลือก?
คีย์ลัด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.