Можно ли выбрать EXISTS напрямую как бит? - PullRequest
172 голосов
/ 03 мая 2010

Мне было интересно, возможно ли сделать что-то подобное (что не работает):

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

Похоже, это должно быть выполнимо, но многие вещи, которые должны работать в SQL, не работают;) Я видел обходные пути для этого (SELECT 1, где ... существует ...), но, похоже, я должен быть возможность просто преобразовать результат существующей функции как бит и покончить с этим.

Ответы [ 9 ]

252 голосов
/ 03 мая 2010

Нет, вам придется использовать обходной путь.

Если вы должны вернуть условный бит 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
47 голосов
/ 03 мая 2010
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'

Когда вы приводите в бит

  • 0 -> 0
  • все остальное -> 1
  • И NULL -> NULL, конечно, но вы не можете получить NULL с COUNT (*) без GROUP BY

bit отображается непосредственно на boolean в типах данных .net, даже если это не совсем ...

Это выглядит аналогично, но не дает строки (не ноль), если нет совпадений, поэтому это не то же самое

SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%'
11 голосов
/ 21 октября 2012

Я немного опаздываю на это; просто наткнулся на пост. Однако вот решение, которое является более эффективным и аккуратным, чем выбранный ответ, но должно обеспечивать такую ​​же функциональность:

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 голосов
/ 25 августа 2016

Вы можете использовать IIF и CAST

SELECT CAST(IIF(EXISTS(SELECT * FROM theTable 
                       where theColumn like 'theValue%'), 1, 0) AS BIT)
4 голосов
/ 19 апреля 2012

Вы также можете сделать следующее:

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

Если нет значений, начинающихся с 'theValue', это вернет null (без записей), а не бит 0, хотя

2 голосов
/ 03 мая 2010

Нет, это невозможно. Битовый тип данных не является логическим типом данных. Это целочисленный тип данных, который может быть 0,1 или NULL.

0 голосов
/ 20 декабря 2018

Другое решение - использовать ISNULL в тандеме с SELECT TOP 1 1:

SELECT ISNULL((SELECT TOP 1 1 FROM theTable where theColumn like 'theValue%'), 0)
0 голосов
/ 07 марта 2018
SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)
0 голосов
/ 03 мая 2010

Я считаю, что существует можно использовать только в предложении where, поэтому вам придется обойти это решение (или подзапрос с существует в качестве предложения where). Я не знаю, считается ли это обходным решением.

Как насчет этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...