sql - 将 SQL case 语句转换为存储过程?

标签 sql function case

我有一个非常大的脚本,它正在创建多个 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/

相关文章:

c - strdup() - 它在 C 中的作用是什么?

android - 我的 sqlite3 CASE 语句有什么问题?

sql-server - 如何合并 2 个 SQL CASE 语句以在单个列中输出

sql - 在tsql中使用 bool 代数来避免CASE语句或处理复杂的WHERE条件

mysql - SQL 本地数据库设置了吗?

php - 如何从多次包含该值的表中仅获取 1 个结果?

sql - 两个表加入具有不同行的网格

mysql - monetdb SQL 中的变量

c++ - 接受嵌套的可变类模板作为函数模板的参数

python - 查找提供的 Sum 值的组合