sql - SQL 连接到从逗号分隔参数返回表的函数。如果参数为空加入所有
问题描述
鉴于 TSQL 中的以下存储过程可以以逗号分隔的 ID 字符串形式传递,该字符串提供给返回用于连接的 ID 表的函数,如果传入的参数 , 是否有一种优雅的方法来执行此@BomAssemIDs
操作为 NULL,这样就不会选择任何记录,而是选择 ALL。
作为一个连接,它正在过滤,但如果@BomAssemIDs
是 null 我不想使用它。我试图避免额外的代码或动态 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
解决方案
您可以or
使用left 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
推荐阅读
- php - 使用 php 在主页上显示名称(来自 mySQL 的数据)
- angularjs - 如何在 angularJS 移动网站中录制视频和音频
- go - 为什么将遍历从按顺序更改为前/后顺序会使“练习:等效二叉树”中的答案错误?
- dust.js - 同时访问嵌套数组中的外部和内部索引
- c# - 比较两个数据表的值,如果不同,则添加到新数据表以进行添加、更新和删除
- java - 新场景启动后代码如何执行
- angular - 如何从目录访问打字稿中的文件名
- reactjs - 使用带有反应生命周期方法的 react-apollo 2.1 突变
- javascript - 解析 EntityName XMLHttpRequest 请求时出错
- c++ - free():多次调用后下一个大小无效(快速)