Можно ли выбрать EXISTS напрямую как бит?

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

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

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

Ответ 1

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

Если вы должны вернуть условный бит 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

Ответ 2

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%'

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

SELECT IIF(EXISTS(SELECT * FROM theTable WHERE theColumn LIKE 'theValue%'), 1, 0)

Ответ 8

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

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

Ответ 9

Я считаю, что существует, может использоваться только в предложении 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