【问题标题】:SQL Server: User-Define Function w/Table Parameters FilteringSQL Server:带有表参数过滤的用户定义函数
【发布时间】:2017-11-20 23:05:07
【问题描述】:

我想创建一个表值函数,它根据 Table2 中的值过滤 Table1,但如果 Table2 不包含任何内容,则应用 NO 过滤。

我不擅长 SQL,所以这是我目前所掌握的:

CREATE FUNCTION MyFunction(@table2 Table2 READONLY)
    RETURNS TABLE
        AS RETURN (
        SELECT userID, first_name, last_name
        FROM Table1
        WHERE EXISTS (SELECT user_ID FROM Table2 WHERE user_ID = Table1.user_ID AND user_security_group = 5)
)

在上述情况下,如果用户在user_security_group 5 中,该函数应返回所有用户及其名字/姓氏。

但如果user_security_group 5 中不存在任何用户,我想返回所有用户(即不应用过滤)。所以,伪代码如下:

CREATE FUNCTION MyFunction(@table2 Table2 READONLY)
    RETURNS TABLE
        AS RETURN (
        SELECT userID, first_name, last_name
        FROM Table1

        -- pseudo code here
        IF WHERE EXISTS (SELECT user_ID FROM Table2 WHERE user_ID = Table1.user_ID AND user_security_group = 5)
        -- THEN APPLY FILTERING
        -- ELSE DO NOT APPLY FILTERING

)

如何在MyFunction 中实现愿望功能?谢谢。

附: - 上面的例子是简单的情况。理想情况下,我会将多个表作为参数传递给MyFunction,并对每个参数表应用相同的 IF/ELSE 逻辑。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    一种方法是在WHERE 子句中使用第二个条件:

        SELECT t1.userID, t1.first_name, t1.last_name
        FROM Table1 t1
        WHERE EXISTS (SELECT 1 FROM Table2 t2 WHERE t2.user_ID = t1.user_ID AND t2.user_security_group = 5) OR
              NOT EXISTS (SELECT 1 FROM Table2 t2 WHERE t2.user_security_group = 5) ;
    

    【讨论】:

    • 但这两种情况都会返回,不是吗?认为他应该先用 count 再用 IF 语句
    • @Veljko89 。 . .为什么不让 SQL 优化器来完成这项工作呢?
    • @Veljko89 - 您提议的 COUNT + IF 语句解决方案是什么样的?谢谢。
    • @GordonLinoff 我读你的解决方案太快了。您的 OR 语句确实有效,非常酷的方法;谢谢。
    猜你喜欢
    • 2016-11-25
    • 2015-06-08
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-06-10
    相关资源
    最近更新 更多