【问题标题】:SQL Join to function that returns table from comma delimited parameter. If parameter is null Join to allSQL 连接到从逗号分隔参数返回表的函数。如果参数为空加入所有
【发布时间】:2020-08-07 11:00:58
【问题描述】:

鉴于 TSQL 中的以下存储过程可以以逗号分隔的 ID 字符串形式传递,该字符串提供给返回用于连接的 ID 表的函数,如果传入参数 @BomAssemIDs 为 NULL,因此不会选择任何记录,而是选择 ALL。

作为一个连接它正在过滤,但如果@BomAssemIDs 为空,我不想使用它。我试图避免额外的代码或动态 SQL,所以现在我的解决方案将是一个大的 if 语句,一个使用表函数 join,另一个不使用它。似乎我应该能够优雅地表达这一点,但我无法掌握它。使用 SQLServer 2012

ALTER PROCEDURE dbo.[up_BomAssem_by_BomAssemIDs]
    @JobID  int ,
    @BomAssemIDs varchar(2000) 
AS
BEGIN     
    SELECT ba.* 
    FROM BomAssem ba 
    JOIN dbo.uf_SplitIntIDsToTable(@BomAssemIDs) sl ON ba.BomAssemID = sl.RecID
    where ba.JobID = @JobID    
END

【问题讨论】:

    标签: sql sql-server join conditional-statements csv


    【解决方案1】:

    鉴于您仅使用 join 进行过滤,我会将其移至 where 子句(过滤所属的位置),然后添加 OR 以测试 where @BomAssemIDs is null,如果是这样,则允许所有记录通过例如

    SELECT ba.* 
    FROM BomAssem ba
    WHERE ba.JobID = @JobID
    AND (
      @BomAssemIDs IS NULL
      OR ba.BomAssemID IN (select RecId from dbo.uf_SplitIntIDsToTable(@BomAssemIDs))
    );
    

    如果我没有指出您最好使用 Table Valued Parameter 而不是逗号分隔的字符串传递列表,那我就失职了。

    【讨论】:

    • 噢!是的,我被卷入了明显逃脱的加入中。我认为因为我的分数很少,我没有投票权?但这有效。呃...或者我点击复选图标....double Doh。
    • 教育....就像魔术一样!我也会查看 Table 参数...谢谢。
    【解决方案2】:

    您可以将orleft join 一起使用:

    SELECT ba.* 
    FROM BomAssem ba LEFT JOIN
         dbo.uf_SplitIntIDsToTable(@BomAssemIDs) sl
         ON ba.BomAssemID = sl.RecID OR @BomAssemIDs IS NULL
    WHERE ba.JobID = @JobID;
    

    或者直接使用union all:

    SELECT ba.* 
    FROM BomAssem ba JOIN
         dbo.uf_SplitIntIDsToTable(@BomAssemIDs) sl
         ON ba.BomAssemID = sl.RecID 
    WHERE ba.JobID = @JobID
    UNION ALL
    SELECT ba.* 
    FROM BomAssem ba
    WHERE @BomAssemIDs IS NULL
    

    【讨论】:

    • 当@BomAssemID 为 Null 时,不返回任何记录,这不是我要查找的。​​span>
    猜你喜欢
    • 1970-01-01
    • 2015-11-12
    • 2013-05-11
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多