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.

jcollum
sumber

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
Alex K.
sumber
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%'
gbn
sumber
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
JohnLBevan
sumber
7

Anda bisa menggunakan IIFdanCAST

SELECT CAST(IIF(EXISTS(SELECT * FROM theTable 
                       where theColumn like 'theValue%'), 1, 0) AS BIT)
Jaider
sumber
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

Nelson
sumber
2

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

Martin Smith
sumber
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)
anar khalilov
sumber
-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
ScottK
sumber
Bagaimana dengan case ketika di pilih?
tombol rendah
-1
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)
MEC
sumber