2017-10-09 252 views
0

我写了一个SQL查询一样,SQL查询与条件在where子句

DECLARE @TypeID BIGINT 

--SET @TypeID=169 

SELECT TypeID from TrnChecklist where TypeID IN 
(CASE WHEN (@TypeID IS NOT NULL AND @TypeID <> '') THEN @TypeID 
ELSE (select distinct TypeID from TrnChecklist where AuditID=57) END) 

如果我提供@TypeID它给了我的记录。但是如果我不提供@TypeID那么它给了我错误

“子查询返回多个值。当子查询遵循=,!=,......这是不允许的”

但是我使用“TYPEID IN”在自条件“选择从TrnChecklist不同TYPEID其中AuditID = 57”返回多个值

我的数据样本(在TrnChecklist表。少量其它列,但我我只使用这些2)

enter image description here

+2

? –

+0

由于(从TrnChecklist中选择不同的TypeID,其中AuditID = 57),您正在获取多行的错误。 –

回答

2

CASE expression evaluates a list of conditions and returns one of multiple possible result expressions.

它不工作,因为你是在预期收益率为评价标值的情况下表达返回每评估多个值。

如果你把表格数据,it evaluates each row to return a value per row

您可以使用您正在使用的数据库此查询这里

SELECT TypeID FROM TrnChecklist WHERE TypeID IN 
(SELECT TypeID FROM TrnChecklist 
WHERE AuditID=57 AND (@TypeID IS NULL OR @TypeID = '') 
UNION SELECT @TypeID) 
+1

正是我在想什么。也许'联盟所有',而不是一个大问题。 –

+0

谢谢。有用。 – user1497569

1

我试图在IN()中使用case表达式不太可能工作。尝试使用布尔逻辑。您希望通过参数指定值,或者您希望IN()列表匹配。

DECLARE @TypeID bigint 

--SET @TypeID=169 

SELECT 
    TypeID 
FROM TrnChecklist 
WHERE (TypeID = @TypeID AND @TypeID IS NOT NULL AND @TypeID <> '') 
OR (NOT (TypeID = @TypeID AND @TypeID IS NOT NULL AND @TypeID <> '') 
    AND TypeID IN (SELECT DTypeID 
        FROM TrnChecklist 
        WHERE AuditID = 57) 
    ) 

可能有几个条件仍然可以从上面的查询中删除,但我认为它会工作。

请注意,我删除了不同的。通常,distinct的成本大于列表中的大小。如果真的需要的话放回去。

+0

谢谢。有用。 – user1497569