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;