我有一个非常大的脚本,它正在创建多个 View 。在许多 View 中都使用同一段脚本。下面列出了该脚本。
CASE WHEN pc.[user_name] IN
(
SELECT [user_name]
FROM people AS p WITH(NOLOCK)
WHERE p.status_id = 1 p.last_login > DATEADD(MONTH, -12, GETDATE())
AND p.[user_name] NOT IN
(
SELECT p.[user_name]
FROM people AS p WITH(NOLOCK)
WHERE p.status_id IN (1,2) AND p.[user_name] LIKE '%2'
)
) THEN pc.[user_name]
ELSE 'standarduser' END AS created_by
有人能给我指出如何编写一个可以传入 pc.[user_name] 并返回正确值的函数的正确方向吗?我对 SQL 中的函数很陌生。谢谢。
最佳答案
该函数可以按如下方式创建:
CREATE FUNCTION [dbo].[FunctionName] (@UserName VARCHAR(50))
RETURNS VARCHAR(50)
AS
BEGIN
RETURN COALESCE(
( SELECT [User_name]
FROM people AS p WITH(NOLOCK)
WHERE p.status_id = 1
AND p.last_login > DATEADD(MONTH, -12, GETDATE())
AND p.[user_name] NOT LIKE '%2'
AND [User_name] = @UserName
), 'StandardUser')
END
基于 user_name 是唯一的假设,我尝试尽可能简化您的选择,即 user_name 的 status_ID 不能同时为 1 和 2,这使我能够删除 NOT IN
从语句中,因为您首先选择一组 status_ID 为 1 的用户,然后从其中删除 status_ID 为 1 或 2 并且用户名以 2 结尾的用户。因为第一组中没有人会这样做status_ID 不为 1,那么您可以删除第一组中用户名以 2 结尾的用户,这不需要子查询,只需要一个 where 子句。
话虽如此,我仍然倾向于使用 View 或类似的基于集的解决方案来实现相同的结果。像这样的东西:
SELECT *, COALESCE(a.[User_Name], 'StandardUser') [NewUserName]
FROM People p
LEFT JOIN
( SELECT [User_name]
FROM people AS p WITH(NOLOCK)
WHERE p.status_id = 1
AND p.last_login > DATEADD(MONTH, -12, GETDATE())
AND p.[user_name] NOT LIKE '%2'
) a
ON p.[User_name] = a.[User_name]
关于sql - 将 SQL case 语句转换为存储过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9976020/