如何在 SQL Select 语句中返回布尔值?
我试过这段代码:
SELECT CAST(1 AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)
并且仅TRUE
当UserID
存在于表上时才返回。FALSE
如果UserID
桌子上不存在,我希望它返回。
如果用户不存在,您所拥有的将根本不返回任何行。这是您需要的:
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
and 0 = false
,您需要做的就是计算行数,然后转换为 a boolean
。
因此,您发布的代码只需要COUNT()
添加一个函数:
SELECT CAST(COUNT(1) AS BIT) AS Expr1
FROM [User]
WHERE (UserID = 20070022)
使用返回 0 或 1 的“存在”。
查询将如下所示:
SELECT EXISTS(SELECT * FROM USER WHERE UserID = 20070022)
select CAST(COUNT(*) AS BIT) FROM [User] WHERE (UserID = 20070022)
如果 count(*) = 0 返回 false。如果 count(*) > 0 返回真。
我这样做:
SELECT 1 FROM [dbo].[User] WHERE UserID = 20070022
看到一个布尔值永远不能为空(至少在.NET中),它应该默认为false,或者如果它默认为true,你可以自己设置它。然而 1 = true,所以 null = false,并且没有额外的语法。
注意:我使用 Dapper 作为我的 micro orm,我想 ADO 应该也可以这样工作。
对于那些有兴趣获得添加自定义列名称的值的人,这对我有用:
CAST(
CASE WHEN EXISTS (
SELECT *
FROM mytable
WHERE mytable.id = 1
)
THEN TRUE
ELSE FALSE
END AS bool)
AS "nameOfMyColumn"
如果您对保持名称的大小写不感兴趣(在某些客户端中),您可以跳过列名称中的双引号。
我为此稍微调整了@Chad 的答案。
请注意另一个等效问题:创建一个 SQL 查询,如果条件满足则返回 (1),否则返回空结果。请注意,此问题的解决方案更通用,可以轻松地与上述答案一起使用,以实现您提出的问题。由于这个问题更普遍,除了上面针对您的问题提出的漂亮解决方案之外,我还证明了它的解决方案。
SELECT DISTINCT 1 AS Expr1
FROM [User]
WHERE (UserID = 20070022)
DECLARE @isAvailable BIT = 0;
IF EXISTS(SELECT 1 FROM [User] WHERE (UserID = 20070022))
BEGIN
SET @isAvailable = 1
END
最初 isAvailable 布尔值设置为 0