是否有可能直接选择EXISTS?

jco*_*lum 178 sql t-sql sql-server

我想知道是否有可能做这样的事情(这不起作用):

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

看起来它应该是可行的,但许多应该在SQL中工作的东西不会;)我已经看到了这方面的解决方法(SELECT 1 where ... Exists ...)但似乎我应该能够将存在函数的结果转换为一点并完成它.

Ale*_* K. 258

不,你必须使用一种解决方法.

如果必须返回条件位0/1,则另一种方法是:

SELECT CAST(
   CASE WHEN EXISTS(SELECT * FROM theTable where theColumn like 'theValue%') THEN 1 
   ELSE 0 
   END 
AS BIT)
Run Code Online (Sandbox Code Playgroud)

或者没有演员:

SELECT
   CASE
       WHEN EXISTS( SELECT 1 FROM theTable WHERE theColumn LIKE 'theValue%' )
            THEN 1 
       ELSE 0 
   END
Run Code Online (Sandbox Code Playgroud)

  • 如果要将结果存储为Bit数据类型,则不需要强制转换,因为强制转换已经隐式. (16认同)
  • 刚刚测试了这种技术,效果很好.从SQL Server 2008 R2测试的查询结果中不需要CAST到BIT. (3认同)

gbn*_*gbn 50

SELECT CAST(COUNT(*) AS bit) FROM MyTable WHERE theColumn like 'theValue%'
Run Code Online (Sandbox Code Playgroud)

当你投射到位

  • 0 - > 0
  • 其他一切 - > 1
  • 并且NULL - >当然是NULL,但如果没有GROUP BY,则无法使用COUNT(*)获取NULL

bit直接映射到boolean.net数据类型,即使它不是真的......

这看起来很相似,但如果没有匹配则不给出行(不为零),所以它不一样

SELECT TOP 1 CAST(NumberKeyCOlumn AS bit) FROM MyTable WHERE theColumn like 'theValue%'
Run Code Online (Sandbox Code Playgroud)

  • 在检查是否存在记录时,EXISTS比COUNT更有效 - 请参阅http://sqlblog.com/blogs/andrew_kelly/archive/2007/12/15/exists-vs-count-the-battle-never-ends.aspx (13认同)
  • 这不是一种解决方法,它是一种正确的设置方式.EXISTS是这个解决方法......而且非常干净,不是吗? (6认同)
  • 与`EXISTS`不同,`COUNT`即使在找到第一行之后也会继续查找匹配行的数据,因为它需要计数. (6认同)
  • 但这根本不使用EXISTS.我没有问如何解决它,我可以找到解决方法,我问是否有一些技巧使用存在作为我不知道的位. (4认同)

Joh*_*van 11

我对此有所了解; 只是偶然发现了这个帖子.然而,这是一个比选择的答案更有效和整洁的解决方案,但应该提供相同的功能:

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
Run Code Online (Sandbox Code Playgroud)


Jai*_*der 7

你可以使用IIFCAST

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


小智 5

您还可以执行以下操作:

SELECT DISTINCT 1
  FROM theTable
 WHERE theColumn LIKE 'theValue%'
Run Code Online (Sandbox Code Playgroud)

如果没有以 'theValue' 开头的值,这将返回 null(无记录)而不是位 0