您似乎正在尝试编写一个查询来处理两种情况:
1. @filter = "x,y,z"
2. @filter IS NULL
为了优化场景 2,我会在 UDF 上进行 INNER JOIN,而不是使用 IN 子句......
SELECT * FROM table
INNER JOIN dbo.udfGetTableFromStringList(@Filter, ',') AS filter
ON table.FilterField = filter.Value
为了针对场景 2 进行优化,我不会尝试调整现有查询,而是故意将这些情况分开,使用 IF 语句或 UNION 并使用 WHERE 子句模拟 IF...
TSQL 中频
IF (@filter IS NULL)
SELECT * FROM table
ELSE
SELECT * FROM table
INNER JOIN dbo.udfGetTableFromStringList(@Filter, ',') AS filter
ON table.FilterField = filter.Value
UNION 模拟 IF
SELECT * FROM table
INNER JOIN dbo.udfGetTableFromStringList(@Filter, ',') AS filter
ON table.FilterField = filter.Value
UNION ALL
SELECT * FROM table WHERE @filter IS NULL
这种设计的优点是每个案例都很简单,确定哪个简单是它自己简单的。然而,将两者结合到一个查询中会导致妥协,例如 LEFT JOIN,因此会给每个查询带来显着的性能损失。