sql - 是否在 STRING_SPLIT 上加入但仅在某个条件下?
问题描述
我有这样的东西
-- @employees is a comma seperated list. Ex: 'E001,E002,E003'
SELCT *
FROM MyTable mt
INNER JOIN STRING_SPLIT(@employees, ',') dt
ON dt.value = mt.EmployeeId
内部连接被用作 WHERE 子句,因此我只获取具有我传入的employeeIds 的项目。但是,我想更改它,以便如果我传入一个空列表,它不会执行加入了。
那么,我该怎么做呢?这是一些伪代码来说明我需要什么:
SELCT *
FROM MyTable mt
IF (@employees != '')
BEGIN
INNER JOIN STRING_SPLIT(@employees, ',') dt
ON dt.value = mt.EmployeeId
END
解决方案
相反,将条件移动到where
并使用:
SELCT mt.*
FROM MyTable mt
WHERE EXISTS (SELECT 1
FROM STRING_SPLIT(@employees, ',') dt
WHERE dt.value = mt.EmployeeId
) OR
@employees IS NULL;
编辑:
您可能会发现这UNION ALL
会产生更好的执行计划:
SELCT mt.*
FROM MyTable mt JOIN
STRING_SPLIT(@employees, ',') dt
ON dt.value = mt.EmployeeId
UNION ALL
SELECT mt.*
FROM MyTable mt
WHERE @employees IS NULL;
推荐阅读
- php - 使用共享网络路径将文件上传到目录
- python - 如何单击 pygame 窗口中的特定位置?
- javascript - 由于 Dropzone 溢出隐藏,JQuery Draggable + Droppable 与拖动的对象剪辑
- sql - 我想嵌套两个 sql 命令。第一个 t 依赖于先前查询的结果
- php - 使用循环的多mysql删除功能
- kubernetes - 如果 Kubernetes 命名空间不存在,如何创建它?
- javascript - 提醒用户每个数组值是否为数字
- vue.js - Django rest 框架在 400 Bad request 期间从响应中获取错误消息
- c# - 无限期地等待进程终止或某个状态
- javascript - 使用 javascript 循环为图像添加 alt