是否可以使用 EXISTS
的值作为查询的一部分?
(请注意:不幸的是,由于客户端限制,我需要 SQLServer 2005 兼容的答案!)
因此,当返回一组结果时,其中一列是一个 bool 值,用于说明子查询是否会返回任何行。
例如,我想返回用户名列表以及不同的表是否包含每个用户的任何行。以下内容在语法上不正确,但希望能让您了解我的意思...
SELECT T1.[UserName],
(EXISTS (SELECT *
FROM [AnotherTable] T2
WHERE T1.[UserName] = T2.[UserName])
) AS [RowsExist]
FROM [UserTable] T1
结果集包含名为 [UserName]
的列和名为 [RowsExist]
的 bool 列。
显而易见的解决方案是使用CASE
,如下所示,但我想知道是否有更好的方法......
SELECT T1.[UserName],
(CASE (SELECT COUNT(*)
FROM [AnotherTable] T2
WHERE T1.[UserName] = T2.[UserName]
)
WHEN 0 THEN CAST(0 AS BIT)
ELSE CAST(1 AS BIT) END
) AS [RowsExist]
FROM [UserTable] T1
最佳答案
您的第二个查询语法无效。
SELECT T1.[UserName],
CASE
WHEN EXISTS (SELECT *
FROM [AnotherTable] T2
WHERE T1.[UserName] = T2.[UserName]) THEN CAST(1 AS BIT)
ELSE CAST(0 AS BIT)
END AS [RowsExist]
FROM [UserTable] T1
通常没问题,将作为半连接实现。
文章Subqueries in CASE Expressions对此进行了进一步讨论。
在某些情况下,COUNT
查询实际上可以执行得更好,但 as discussed here
关于t-sql - 在 SQL 中使用 EXISTS 作为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18787453/