簡體   English   中英

在where子句中具有條件的SQL查詢

[英]SQL Query with condition in where clause

我寫了一個sql查詢,

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,則會給我錯誤

“子查詢返回的值大於1。當子查詢遵循=,!=,......時,不允許這樣做。”

但是我在其中使用條件的情況下使用“ TypeID IN”,因為“從TrnChecklist中選擇不同的TypeID,其中AuditID = 57”返回多個值

我的數據樣本(在TrnChecklist表中。其他幾列,但我僅使用這2個)

在此處輸入圖片說明

CASE表達式計算條件列表,並返回多個可能的結果表達式之一。

這是行不通的,因為您要在CASE表達式中為每個評估返回多個值,該表達式應為每個評估返回標量值。

如果將大小寫放在表數據上, 它將評估每一行以返回每行一個值

您可以在這里使用此查詢

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

我試圖在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。 通常,distinct的成本大於in列表的大小。 如果確實需要,請放回去。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM