在SQL Select语句上返回布尔值


144

如何在SQL Select语句上返回布尔值?

我尝试了这段代码:

SELECT CAST(1 AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)

而且它只返回TRUE如果UserID表中存在。FALSE如果UserID表上不存在它,我希望它返回。


3
哪个dbms?sql的详细信息有所不同。
joshp 2012年

SQL Server不支持布尔类型,例如SELECT WHEN CAST(1 AS BIT) THEN 'YES' END AS result-导致错误,即CAST(1 AS BIT)逻辑TRUE不相同。
2012年

Answers:


253

如果用户不存在,那里的内容将完全不返回任何行。这是您需要的:

SELECT CASE WHEN EXISTS (
    SELECT *
    FROM [User]
    WHERE UserID = 20070022
)
THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT) END

2
为什么使用星号,最好使用1而不是*

7
@ robertpeter07-两者是等效的,但*更惯用。看到这个问题
乍得

如果在WHILE循环上使用,我是否必须在“ WHILE”之后将其括在大括号{}中?
full_prog_full

您可以在返回值中添加列名吗?
xMetalDetectorx

3
@xMetalDetectorx这为我添加了列名称(该AS bool部分非常重要):CAST( CASE WHEN EXISTS ( SELECT * FROM mytable WHERE mytable.id = 1) THEN TRUE ELSE FALSE END AS bool) AS nameofmycolumn
Lucio Mollinedo


22

鉴于普遍1 = true0 = false,所有你需要做的是数列的数量,及演员boolean

因此,您发布的代码仅需要COUNT()添加一个函数:

SELECT CAST(COUNT(1) AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)

8
在做Exists(试验比做得更快Count(1)上有大量行的表测试。
斯科特·张伯伦

5
大概。我没有对性能提出任何要求,只是为实现OP所需的最小代码更改而已。但是,如果UserID确实为索引建立了索引(甚至是PK),那么您将直接进入存在(或不存在)的唯一行。
斯图尔特


8
select CAST(COUNT(*) AS BIT) FROM [User] WHERE (UserID = 20070022)

如果count(*)= 0,则返回false。如果count(*)> 0,则返回true。


4

我这样做是这样的:

SELECT 1 FROM [dbo].[User] WHERE UserID = 20070022

看到布尔值永远不能为null(至少在.NET中),它应该默认为false,或者如果默认为true,则可以将其设置为该值。但是1 = true,因此null = false,没有其他语法。

注意:我使用Dapper作为我的微型插件,我想ADO应该也能正常工作。


到目前为止,我最喜欢的,最简洁的答案。摆弄
#!

“视为布尔值永远不能为null(至少在.NET中)。” (bool?)是可为null的布尔值。
Andrew Dennison

1

注意另一个等效的问题:如果条件成立,则创建一个返回(1)的SQL查询,否则返回空结果。请注意,此问题的解决方案更为通用,可以轻松地与上述答案一起使用,以解决您提出的问题。由于此问题较笼统,因此,除了上面为您提供的精美解决方案之外,我还证明了其解决方案。

SELECT DISTINCT 1 AS Expr1
FROM [User]
WHERE (UserID = 20070022)

1

对于那些对增加自定义列名的值感兴趣的人,这对我有用:

CAST(
    CASE WHEN EXISTS ( 
           SELECT * 
           FROM mytable 
           WHERE mytable.id = 1
    ) 
    THEN TRUE 
    ELSE FALSE 
    END AS bool) 
AS "nameOfMyColumn"

如果您不希望保留名称的大小写敏感性(在某些客户端中),可以跳过列名称中的双引号。

我对此略微调整了@Chad的答案。


消息102,级别15,状态1,第8行'CAST'附近的语法不正确。消息156,级别15,状态1,第12行关键字'THEN'附近的语法错误。
ShaneC

@ShaneC我在PostgreSQL 9.X上测试了此代码,并且运行良好。您正在使用什么服务器?
卢西奥·莫利琳多

0
DECLARE @isAvailable      BIT = 0;

IF EXISTS(SELECT 1  FROM [User] WHERE (UserID = 20070022))
BEGIN
 SET @isAvailable = 1
END

最初isAvailable布尔值设置为0

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.