回答:
いいえ、回避策を使用する必要があります。
条件付きビット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
SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'
ビットにキャストすると
bit
boolean
.netデータ型に直接マップします。実際にはそうではありません...
これは同じように見えますが、一致しない場合、行はありません(ゼロではありません)ため、同じではありません。
SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%'
EXISTS
、COUNT
カウントを取得する必要があるため、最初の行を見つけた後でも、一致する行のデータを探し続けます。
私はこれへの取り込みに少し遅れています。投稿を偶然見つけました。ただし、これは選択した回答よりも効率的で優れたソリューションですが、同じ機能を提供するはずです。
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
いいえ、それは不可能です。ビットデータ型はブールデータ型ではありません。これは、0、1、またはNULLの整数データ型です。
IF(@TRUE)
たとえば、SQLでビット変数をブール値として使用したり、その逆を行ったりして、ブール式をビットに強制変換することはできません。(例:SET @BitVariable = (1=1)
)
私はexistsは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