在SQL Select语句上返回布尔值

在SQL Select语句上返回布尔值,sql,select,boolean,Sql,Select,Boolean,如何在SQL Select语句上返回布尔值 我尝试了以下代码: SELECT CAST(1 AS BIT) AS Expr1 FROM [User] WHERE (UserID = 20070022) 并且它仅在表中存在UserID时返回TRUE。如果用户ID在表中不存在,我希望它返回FALSE。如果用户不存在,您在表中拥有的将不会返回任何行。以下是您需要的: SELECT CASE WHEN EXISTS ( SELECT * FROM [User] WHERE Us

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

我尝试了以下代码:

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

并且它仅在表中存在UserID时返回TRUE。如果用户ID在表中不存在,我希望它返回FALSE。

如果用户不存在,您在表中拥有的将不会返回任何行。以下是您需要的:

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

可能是这样的:

SELECT CAST(CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 END AS BIT)
FROM dummy WHERE id = 1;
假设通常为1=true和0=false,则只需计算行数,并转换为布尔值

因此,您发布的代码只需要添加一个计数函数:

SELECT CAST(COUNT(1) AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)
如果count*=0,则返回false。如果count*>0返回true。

我这样做:

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

至少在.NET中,布尔值不能为null,因此它应该默认为false,或者如果默认为true,您可以自己设置为false。但是1=true,所以null=false,并且没有额外的语法


注意:我使用Dapper作为我的micro orm,我想ADO也应该是一样的。

使用返回0或1的'Exists'

查询将类似于:

SELECT EXISTS(SELECT * FROM USER WHERE UserID = 20070022)

请注意另一个等价的问题:创建一个SQL查询,如果满足条件则返回1,否则返回空结果。请注意,此问题的解决方案更为一般,可以轻松地与上述答案结合使用,以实现您提出的问题。由于这个问题更一般,我正在证明它的解决方案,除了上面为您的问题提供的漂亮的解决方案

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

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

CAST(
    CASE WHEN EXISTS ( 
           SELECT * 
           FROM mytable 
           WHERE mytable.id = 1
    ) 
    THEN TRUE 
    ELSE FALSE 
    END AS bool) 
AS "nameOfMyColumn"
如果您不想在某些客户机中保持名称的大小写敏感性,可以跳过列名的双引号

我稍微修改了@Chad的答案

DECLARE @isAvailable      BIT = 0;

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


最初,isAvailable布尔值设置为0

哪个dbms?sql的详细信息不同。sql Server不支持布尔类型,例如,选择何时将CAST1作为位,然后选择“是”结束作为结果-导致错误,即CAST1作为位的逻辑值不相同。这将返回一个字符串,不是布尔值包含列名是一种很好的做法-在COUNT*>0时选择CASTCASE,然后在id=1的dummy中选择1或0作为mycolumnname结束,在dummy中执行Exists测试要比在具有大量行的表上执行Count1测试快得多。可能吧。在我的回答中,我对性能没有任何要求,只是对代码进行了最小的更改,以实现OP想要的功能。但是,如果列UserID被索引,或者甚至是PK,那么您肯定会直接进入存在或不存在的唯一行。为什么要使用星号,最好使用1而不是*@robertpeter07-两者是等效的,但*更惯用。请参阅。如果在WHILE循环中使用,则必须将其括在大括号{}内就在'WHILE'之后?您能将列名添加到返回值吗?@xMetalDetectorx这对我来说很有效,添加列名AS bool部分非常重要:CAST CASE WHEN EXISTS SELECT*FROM mytable WHERE mytable.id=1然后TRUE ELSE FALSE结束为bool AS nameofmycolumnError:关键字'EXISTS'附近的语法不正确。在这种情况下,SELECT 1会比SELECT*快吗?对我来说,它非常适合我最喜欢、最简洁的答案。所有答案的混乱:至少在.NET中,视为布尔值永远不能为空。布尔?是可为空的bool.Msg 102,级别15,状态1,第8行“CAST”附近的语法不正确。Msg 156,级别15,状态1,第12行关键字“THEN”附近的语法不正确。@ShaneC我在PostgreSQL 9.X上测试了这段代码,效果很好。你用的是什么服务器?
DECLARE @isAvailable      BIT = 0;

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