我的子查询在 CASE 语句中返回了超过 1 个值

My subquery returned more than 1 value In CASE statement

我试图从我的存储过程中获取一些数据。 @ContactID 是输入参数,用户在此处单击查询触发的显示按钮。因此,如果 @ContactID 为空,那么我想 return 整个 table 并且当 @ContactID 有一些值时,我只想 return 那个特定的行.谢谢

DECLARE @ContactID INT = NULL

SELECT * 
FROM Contact C 
WHERE C.PK_Contact IN (CASE WHEN @ContactID IS NULL THEN (SELECT PK_Contact FROM Contact) ELSE @ContactID END)

但是我得到这个错误:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

删除 IN 和子查询:

declare @ContactID int =null
SELECT * 
FROM Contact C 
WHERE C.PK_Contact = (CASE WHEN @ContactID IS NULL THEN C.PK_Contact ELSE @ContactID END)

所以当@ContactID is NULL条件是

WHERE C.PK_Contact = C.PK_Contact 

始终为 TRUE,这将 return 所有行。

你能试试这个吗?

-- you should *really* get in the habit of explicitly spelling out which columns you need! 
-- Don't use "SELECT *" in production code!
SELECT *    
FROM dbo.Contact C 
WHERE C.PK_Contact = ISNULL(@ContactID, C.PK_Contact)

如果 @ContactID 具有特定值 - 那么您只是返回与该 ID 值匹配的那些行。如果 @ContactID 为 NULL,则返回所有行。

你也可以这样做。

SELECT * 
FROM Contact
WHERE (@ContactID is null or PK_Contact = @ContactID)


例子
Table 结构和示例数据

CREATE TABLE mytable (id INT, val INT);

INSERT INTO mytable
VALUES (1,'25'),
       (2,'55'),
       (3,'25'),
       (4,'10'),
       (5,'60');


当输入为空时...

DECLARE @input INT = NULL

SELECT *
FROM mytable
WHERE (@input IS NULL OR id = @input)

输出

+-----+-----+
| id  | val |
+-----+-----+
|  1  |  25 |
|  2  |  55 |
|  3  |  25 |
|  4  |  10 |
|  5  |  60 |
+-----+-----+


当输入不为空时...

DECLARE @input INT = 2

SELECT *
FROM mytable
WHERE (@input IS NULL OR id = @input)

输出

+-----+-----+
| id  | val |
+-----+-----+
|  2  |  55 |
+-----+-----+

在线演示:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=3780464672e02557458d22317aed40c9