views:

185

answers:

4

I was wondering if it's possible to do something like this (which doesn't work):

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

Seems like it should be doable, but lots of things that should work in SQL don't ;) I've seen workarounds for this (SELECT 1 where... Exists...) but it seems like I should be able to just cast the result of the exists function as a bit and be done with it.

A: 

No it isn't possible. The bit data type is not a boolean data type. It is an integer data type that can be 0,1, or NULL.

Martin Smith
A bit cannot be null. :)
bzlm
@bzlm Yes it can in SQLServer for well over 10 years. SQL Server 7.0 introduced it http://msdn.microsoft.com/en-us/library/aa237157%28SQL.80%29.aspx
Martin Smith
@bzlm - It sounds like you're clutching at straws and don't really know anything about SQL Server data types to me. The definition of bit in SQL Server is "An integer data type that can take a value of 1, 0, or NULL." http://msdn.microsoft.com/en-us/library/ms177603.aspx. This applies to columns and Transact SQL variables. Nowhere can a bit variable be used as a boolean in SQL with `IF(@TRUE)` for example nor vice-versa can a boolean expression be coerced into a bit. (With e.g. `SET @BitVariable = (1=1)`)
Martin Smith
I see where you're going, but the casting to bit wasn't so much the issue as the being able to select EXISTS directly.
jcollum
+6  A: 
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'

When you cast to bit

  • 0 -> 0
  • everything else -> 1
  • And NULL -> NULL of course, but you can't get NULL with COUNT(*) without a GROUP BY

bit maps directly to boolean in .net datatypes, even if it isn't really...

This looks similar but gives no row (not zero) if no matches, so it's not the same

SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%'
gbn
But this doesn't use EXISTS at all. I wasn't asking how to workaround it, I can find workarounds, I was asking if there was some trick to using exists as bit that I wasn't aware of.
jcollum
This is not a workaround, it's one correct way set-wise. EXISTS is this workaround... And very clean, no?
gbn
So you're saying instead of EXISTS I should use this query? If so, then yes, it's a workaround.
jcollum
@jcollum: yes, or something like this. EXISTS is almost always IF EXISTS or WHERE EXISTS and not used for output like you're trying to do
gbn
+10  A: 

No, you'll have to use a workaround.

If you must return a conditional bit 0/1 another way is to:

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

I believe exists can only be used in a where clause, so you'll have to do a workaround (or a subquery with exists as the where clause). I don't know if that counts as a workaround.

What about this:

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