我的子查询在 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
我试图从我的存储过程中获取一些数据。 @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