apakah mungkin untuk memilih EXISTS secara langsung?


186

Saya bertanya-tanya apakah mungkin melakukan sesuatu seperti ini (yang tidak berhasil):

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

Sepertinya itu bisa dilakukan, tetapi banyak hal yang harus bekerja dalam SQL tidak;) Saya telah melihat solusi untuk ini (PILIH 1 di mana ... Ada ...) tetapi sepertinya saya harus bisa hanya melemparkan hasil dari fungsi yang ada sebagai bit dan selesai dengannya.

Jawaban:


267

Tidak, Anda harus menggunakan solusi.

Jika Anda harus mengembalikan bit kondisional 0/1 cara lain adalah dengan:

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

Atau tanpa pemain:

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

16
Anda tidak perlu pemeran jika Anda menyimpan hasilnya ke dalam datatype Bit karena pemeran sudah tersirat.
MikeTeeVee

3
Baru menguji teknik ini, hasilnya bagus. CAST to BIT tidak perlu mengambil hasil dari kueri, diuji dengan SQL Server 2008 R2.
Tore Aurstad

Dalam kasus saya para pemeran HARUS dihapus
Sérgio S. Filho

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

Ketika Anda melemparkan untuk menggigit

  • 0 -> 0
  • segalanya -> 1
  • Dan NULL -> NULL tentu saja, tetapi Anda tidak bisa mendapatkan NULL dengan COUNT (*) tanpa GROUP BY

bitmemetakan langsung ke booleandalam. Net datatypes, bahkan jika itu tidak benar-benar ...

Ini terlihat mirip tetapi tidak memberikan baris (bukan nol) jika tidak ada yang cocok, jadi tidak sama

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

4
Tapi ini sama sekali tidak menggunakan EXIS. Saya tidak bertanya bagaimana cara mengatasinya, saya dapat menemukan solusi, saya bertanya apakah ada beberapa trik untuk menggunakan ada sedikit yang tidak saya sadari.
jcollum

6
Ini bukan solusi, itu salah satu cara yang benar dan bijaksana. ADA solusinya ... Dan sangat bersih, bukan?
gbn

1
@ jcollum: ya, atau sesuatu seperti ini. EXISTS hampir selalu JIKA EXISTS atau WHIS EXISTS dan tidak digunakan untuk output seperti yang Anda coba lakukan
gbn

14
EXISTS lebih efisien daripada COUNT saat memeriksa keberadaan catatan - lihat sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/…
Tahir Hassan

9
Tidak seperti itu EXISTS, COUNTakan terus mencari dalam data untuk mencocokkan baris bahkan setelah menemukan yang pertama karena itu perlu mendapatkan penghitungan.
Ismail

11

Saya agak terlambat dalam uptake untuk ini; hanya tersandung di pos. Namun, inilah solusi yang lebih efisien & rapi daripada jawaban yang dipilih, tetapi harus memberikan fungsi yang sama:

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

Anda bisa menggunakan IIFdanCAST

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

1
Saya suka ini, tetapi hanya berfungsi di SQL Server 2012 dan lebih tinggi. Sepertinya IIF ditambahkan pada 2012
ja928

5

Anda juga dapat melakukan hal berikut:

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

Jika tidak ada nilai yang dimulai dengan 'theValue' ini akan menghasilkan nol (tidak ada catatan) daripada sedikit 0 sekalipun


2

Tidak itu tidak mungkin. Tipe data bit bukan tipe data boolean. Ini adalah tipe data integer yang bisa 0,1, atau NULL.


3
@ bzlm Ya itu bisa di SQLServer selama lebih dari 10 tahun. SQL Server 7.0 memperkenalkannya msdn.microsoft.com/en-us/library/aa237157%28SQL.80%29.aspx
Martin Smith

4
@ bzlm - Sepertinya Anda mencengkeram dan tidak benar-benar tahu apa-apa tentang tipe data SQL Server kepada saya. Definisi bit dalam SQL Server adalah "Tipe data integer yang dapat mengambil nilai 1, 0, atau NULL." msdn.microsoft.com/en-us/library/ms177603.aspx . Ini berlaku untuk kolom dan Transact variabel SQL. Tidak ada variabel bit yang dapat digunakan sebagai boolean dalam SQL dengan IF(@TRUE)misalnya atau sebaliknya bisa ekspresi boolean dipaksa menjadi sedikit. (Dengan mis. SET @BitVariable = (1=1))
Martin Smith

1
Saya melihat ke mana Anda akan pergi, tetapi casting untuk menggigit tidak begitu menjadi masalah karena bisa memilih langsung ada.
jcollum

1

Solusi lain adalah menggunakan ISNULLbersama-sama dengan SELECT TOP 1 1:

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

-1

Saya percaya ada hanya dapat digunakan di mana klausa, jadi Anda harus melakukan solusi (atau subquery dengan ada sebagai klausa mana). Saya tidak tahu apakah itu dianggap sebagai solusi.

Bagaimana dengan ini:

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

Bagaimana dengan case ketika di pilih?
tombol rendah

-1
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)
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.