T-SQL - 动态计算布尔字段

时间:2012-06-26 06:54:38

标签: sql-server-2008 tsql

我正在使用SQL Server 2008。

假设我有两个假设的表格如下:

CREATE TABLE [Department](
    [Id]            int    IDENTITY(1,1),
    [ManagerId]     int    NULL, -- << Foreign key to the Person table
    -- other fields
)

CREATE TABLE [Person](
    [Id]            int    IDENTITY(1,1),
    [DepartmentId]  int    NOT NULL, -- << Foreign key to the Department table
    -- other fields
)

现在,我想返回[Person]表中的行列表(即给定部门的人员列表)。这些行中只有一个(或零)与[ManagerId]表中的[Department]字段匹配。我想在运行中用匹配的行标记一个布尔字段......结果行集将类似于以下模式:

[Id]        INT,
[IsManager] BIT NOT NULL DEFAULT 0,
-- other fields

[IsManager][Department].[ManagerId]匹配时,[Person].[Id]字段将为TRUE。

这对于两个(或更多)查询来说相当简单。但是如何使用单个SQL语句

实现此目的

2 个答案:

答案 0 :(得分:3)

在您的SELECT条款中添加一个表达式,您可以将人员部门的实际人员IdManagerId进行比较

SELECT
    Person.Id,
    Department.Id,
    CAST(CASE WHEN Person.Id=Department.ManagerId THEN 1 ELSE 0 END AS BIT) AS IsManager
FROM Person
INNER JOIN Department ON Person.DepartmentId=Department.Id
WHERE Person.DepartmentId=<CONDITION>

答案 1 :(得分:2)

从Person表到ManagerId上的department表的左连接将为您提供帮助:

SELECT p.Id AS PersonId, d.Id AS DepartmentId, 
    CAST(CASE WHEN d.Id IS NULL THEN 0 ELSE 1 END) AS IsManager
FROM Person p LEFT JOIN Department d ON p.Id = d.ManagerId

工作原理:无论在ManagerId上是否存在相应的Department匹配,Person中的所有行都将返回。对于那些没有匹配部门的Person记录,结果集中的所有Department字段都是NULL,因此我们可以使用它来确定是否存在匹配。

请注意,如果某人是多个部门的经理,则此查询可能会返回重复的人员记录。为此,我将DepartmentId添加到列表中。如果您需要一个唯一的人员列表及其IsManager标志,请从select子句中删除d.DepartmentId并在选择后插入DISTINCT:

SELECT DISTINCT p.Id AS PersonId, 
    CAST(CASE WHEN d.DepartmentId IS NULL THEN 0 ELSE 1 END) AS IsManager
FROM Person p LEFT JOIN Department d ON p.Id = d.ManagerId