Можно ли выбрать 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