首页 > 解决方案 > 是否在 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

标签: sqlsql-servertsql

解决方案


相反,将条件移动到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;

推荐阅读