0

我需要重写以下两个查询以避免 OR @MyParam IS NULL 检查(通过使用 CASE 中提到的 CASE 语句无法正常工作

是否可以以这种格式重写以下查询?

注意:在存储过程 SQL Server 2008 中如何使用 `IN` 运算符传递字符串参数中提供了 fn_Split 函数

DECLARE @MyParam VARCHAR(MAX)
SET @MyParam = '2,3'

DECLARE @MyTable TABLE (EmpID INT)

INSERT INTO @MyTable VALUES (1)
INSERT INTO @MyTable VALUES (2)
INSERT INTO @MyTable VALUES (3)
INSERT INTO @MyTable VALUES (4)


--Query 1
SELECT * 
FROM @MyTable M
WHERE (
        M.EmpID IN (SELECT CONVERT(int,Value) FROM fn_Split(@MyParam, ','))
        OR @MyParam IS NULL
       )


--Query 2
SELECT * 
FROM @MyTable M
WHERE (EXISTS   (
                  SELECT CONVERT(int,Value) 
                  FROM fn_Split(@MyParam, ',')
                  WHERE CONVERT(int,Value)  =  M.EmpID
                  )
                  OR @MyParam IS NULL
       )
4

1 回答 1

1

使用左连接

SELECT m.* 
FROM @MyTable M
    left join (SELECT CONVERT(int,Value) v FROM fn_Split(@MyParam, ',')) t 
on m.EmpID = t.v 
where v is not null or @MyParam is null

理想情况下,您不会将包含多个值的字符串作为参数传递 - 如果这是一个存储过程,请使用表值参数

于 2013-08-14T11:05:50.670 回答