Có thể chọn EXISTS trực tiếp như một chút không?


185

Tôi đã tự hỏi nếu nó có thể làm một cái gì đó như thế này (không hoạt động):

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

Có vẻ như điều đó có thể thực hiện được, nhưng rất nhiều thứ nên hoạt động trong SQL thì không;) Tôi đã thấy cách giải quyết cho việc này (CHỌN 1 trong đó ... Tồn tại ...) nhưng có vẻ như tôi chỉ có thể truyền kết quả của hàm tồn tại dưới dạng một bit và được thực hiện với nó.

Câu trả lời:


268

Không, bạn sẽ phải sử dụng một cách giải quyết.

Nếu bạn phải trả về bit có điều kiện 0/1 thì cách khác là:

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

Hoặc không có diễn viên:

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

16
Bạn không cần diễn viên nếu bạn đang lưu trữ kết quả vào kiểu dữ liệu Bit vì diễn viên đã ẩn.
MikeTeeVee

3
Chỉ cần thử nghiệm kỹ thuật này, hoạt động tuyệt vời. Không cần CAST đến BIT để lấy kết quả từ truy vấn, được thử nghiệm với SQL Server 2008 R2.
Xé Aurstad

Trong trường hợp của tôi, các diễn viên PHẢI bị loại bỏ
Sérgio S. Filho

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

Khi bạn truyền tới bit

  • 0 -> 0
  • mọi thứ khác -> 1
  • Và NULL -> tất nhiên là NULL, nhưng bạn không thể có được NULL với COUNT (*) mà không có NHÓM THEO

bitánh xạ trực tiếp tới các booleankiểu dữ liệu .net, ngay cả khi nó không thực sự ...

Điều này trông tương tự nhưng không có hàng (không bằng 0) nếu không khớp, vì vậy nó không giống nhau

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

4
Nhưng điều này hoàn toàn không sử dụng EXISTS. Tôi đã không hỏi làm thế nào để giải quyết nó, tôi có thể tìm thấy cách giải quyết, tôi đã hỏi liệu có một số mẹo để sử dụng tồn tại như bit mà tôi không biết.
jcollum

6
Đây không phải là một cách giải quyết, đó là một cách chính xác. EXISTS là cách giải quyết này ... Và rất sạch sẽ, phải không?
gbn

1
@jcollum: có, hoặc một cái gì đó như thế này. EXISTS hầu như luôn luôn NẾU EXIST hoặc WHIST EXISTS và không được sử dụng cho đầu ra như bạn đang cố gắng thực hiện
gbn

14
EXISTS hiệu quả hơn COUNT khi kiểm tra sự tồn tại của một bản ghi - xem sqlblog.com/bloss/andrew_kelly/archive 2007/12/15 / Uiêu
Tahir Hassan

9
Không giống như EXISTS, COUNTsẽ tiếp tục tìm kiếm dữ liệu cho các hàng khớp ngay cả sau khi tìm thấy hàng đầu tiên vì nó cần được tính.
IsmailS

11

Tôi hơi muộn về sự hấp thu cho điều này; chỉ vấp ngã trên bài viết. Tuy nhiên, đây là một giải pháp hiệu quả và gọn gàng hơn câu trả lời đã chọn, nhưng sẽ cung cấp cùng chức năng:

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

Bạn có thể sử dụng IIFCAST

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

1
Tôi thích điều này, nhưng nó chỉ hoạt động trong SQL Server 2012 trở lên. Có vẻ như IIF đã được thêm vào năm 2012
ja928

4

Bạn cũng có thể làm như sau:

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

Nếu không có giá trị nào bắt đầu bằng 'theValue', điều này sẽ trả về null (không có bản ghi) thay vì bit 0 mặc dù


2

Không, điều đó là không thể. Kiểu dữ liệu bit không phải là kiểu dữ liệu boolean. Đây là một kiểu dữ liệu số nguyên có thể là 0,1 hoặc NULL.


3
@bzlm Có trong SQLServer trong hơn 10 năm. SQL Server 7.0 đã giới thiệu nó msdn.microsoft.com/en-us/l Library / aa237157% 28Query.80% 29.aspx
Martin Smith

4
@bzlm - Có vẻ như bạn đang nắm chặt ống hút và thực sự không biết gì về các loại dữ liệu SQL Server đối với tôi. Định nghĩa của bit trong SQL Server là "Một kiểu dữ liệu nguyên có thể lấy giá trị 1, 0 hoặc NULL." msdn.microsoft.com/en-us/l Library / ms177603.aspx . Điều này áp dụng cho các cột và các biến SQL Transact. Không ở đâu một biến bit có thể được sử dụng như một boolean trong SQL, IF(@TRUE)ví dụ như ngược lại, một biểu thức boolean có thể bị ép buộc thành một bit. (Ví dụ SET @BitVariable = (1=1))
Martin Smith

1
Tôi thấy bạn đang đi đâu, nhưng việc chuyển sang bit không phải là vấn đề lớn vì có thể chọn EXISTS trực tiếp.
jcollum

1

Một giải pháp khác là sử dụng ISNULLsong song với SELECT TOP 1 1:

SELECT ISNULL((SELECT TOP 1 1 FROM theTable where theColumn like 'theValue%'), 0)

-1

Tôi tin rằng tồn tại chỉ có thể được sử dụng trong mệnh đề where, vì vậy bạn sẽ phải thực hiện một cách giải quyết (hoặc truy vấn con tồn tại dưới dạng mệnh đề where). Tôi không biết nếu điều đó được tính là một cách giải quyết.

Cái này thì sao:

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

Điều gì về trường hợp whens trong một lựa chọn?
lowkey 8/213

-1
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.