SQL函数的条件返回

SQL函数的条件返回,sql,sql-server,tsql,sql-server-2014,user-defined-functions,Sql,Sql Server,Tsql,Sql Server 2014,User Defined Functions,我能运行这个 USE AdventureWorks2012; GO IF OBJECT_ID(N'dbo.GetJobData', N'IF') IS NOT NULL DROP FUNCTION dbo.GetJobData; GO CREATE FUNCTION dbo.GetJobData (@title NVARCHAR(25)) RETURNS TABLE WITH SCHEMABINDING AS RETUR

我能运行这个

  USE AdventureWorks2012;
    GO
    IF OBJECT_ID(N'dbo.GetJobData', N'IF') IS NOT NULL
    DROP FUNCTION dbo.GetJobData;
    GO
    CREATE FUNCTION dbo.GetJobData (@title NVARCHAR(25))
    RETURNS TABLE
    WITH SCHEMABINDING
    AS
    RETURN
    (
      SELECT COUNT(*) AS TotalEmps
      FROM HumanResources.Employee
      WHERE JobTitle = @title
      GROUP BY JobTitle
    );
    GO
但是我想在@title的基础上添加一些条件,所以我想要这样的东西

      USE AdventureWorks2012;
        GO
        IF OBJECT_ID(N'dbo.GetJobData', N'IF') IS NOT NULL
        DROP FUNCTION dbo.GetJobData;
        GO
        CREATE FUNCTION dbo.GetJobData (@title NVARCHAR(25))
        RETURNS TABLE
        WITH SCHEMABINDING
        AS
        RETURN
        (
WHEN (@title = 'Developer')
THEN
          SELECT COUNT(*) AS TotalEmps
          FROM HumanResources.Employee
          WHERE JobTitle = @title
          GROUP BY JobTitle
ELSE
      SELECT COUNT(*) AS TotalEmps
      FROM HumanResources.Employee
      WHERE JobTitle = @title+'Role'
      GROUP BY JobTitle

    );
    GO
但是不能做到这一点。。。您能帮忙吗,我正在使用MS SQL Server 2014处理where子句中的Case语句,如下所示。您使用的是sql server 2014,因此可以使用Concat函数。而不是@title+“role”。还添加了JobTitle以使其更有意义

 IF OBJECT_ID(N'dbo.GetJobData', N'IF') IS NOT NULL
        DROP FUNCTION dbo.GetJobData;
        GO
        CREATE FUNCTION dbo.GetJobData (@title NVARCHAR(25))
        RETURNS TABLE
        WITH SCHEMABINDING
        AS
        RETURN
        (

          SELECT COUNT(*) AS TotalEmps,JobTitle
          FROM HumanResources.Employee
          WHERE JobTitle = Concat(@title,(CASE WHEN @title <> 'Developer' THEN 'Role' END))
          GROUP BY JobTitle)
END
在where子句中处理Case语句,如下所示。您使用的是sql server 2014,因此可以使用Concat函数。而不是@title+“role”。还添加了JobTitle以使其更有意义

 IF OBJECT_ID(N'dbo.GetJobData', N'IF') IS NOT NULL
        DROP FUNCTION dbo.GetJobData;
        GO
        CREATE FUNCTION dbo.GetJobData (@title NVARCHAR(25))
        RETURNS TABLE
        WITH SCHEMABINDING
        AS
        RETURN
        (

          SELECT COUNT(*) AS TotalEmps,JobTitle
          FROM HumanResources.Employee
          WHERE JobTitle = Concat(@title,(CASE WHEN @title <> 'Developer' THEN 'Role' END))
          GROUP BY JobTitle)
END

可能不如过滤克劳塞布迪的答案那样有效,但效果很好

SELECT JobTitle,
       Count(CASE
               WHEN ( JobTitle = @title
                      AND @title = 'Developer' )
                     OR ( JobTitle = @title + 'Role'
                          AND @title <> 'Developer' ) THEN 1
             END) AS TotalEmps
FROM   HumanResources.Employee
GROUP  BY JobTitle 

注意:我已将JobTitle添加到select中,以标识JobTitle的计数值

可能不如过滤clauseBuddi的答案那样有效,但效果很好

SELECT JobTitle,
       Count(CASE
               WHEN ( JobTitle = @title
                      AND @title = 'Developer' )
                     OR ( JobTitle = @title + 'Role'
                          AND @title <> 'Developer' ) THEN 1
             END) AS TotalEmps
FROM   HumanResources.Employee
GROUP  BY JobTitle 

注意:我已将JobTitle添加到选择中,以标识JobTitle的计数值。OP:将JobTitle添加到选择中将使结果更有意义。@Prdp Yes添加JobTitle将使结果更有意义。但这并不是函数体的一部分,所以跳过了它:。它用于OP;To OP:将JobTitle添加到select将使结果更有意义。@Prdp Yes添加JobTitle将使结果更有意义。但这并不是函数体的一部分,所以跳过了它:。它用于OP;