Sql-Server
如何檢查 WHERE = value 是否不存在並預設為零?
我的目標是檢查 lineId 的值是否存在。如果不是,預設情況下它必須為零。這是我的數據:
例如:
SELECT lineId from table_name WHERE lineId = 80
沒有lineId = 80,那麼我想看那個lineId = 0的記錄。
謝謝,真誠的:)
另一種方法:
SELECT lineId FROM table_name WHERE lineId = 80 UNION ALL SELECT lineId FROM table_name WHERE lineId = 0 AND NOT EXISTS ( SELECT 1 FROM table_name WHERE lineId = 80 ) ;
與 CTE 類似:
WITH cte AS ( SELECT lineId FROM table_name WHERE lineId = 80 ) SELECT * FROM cte UNION ALL SELECT lineId FROM table_name WHERE lineId = 0 AND NOT EXISTS ( SELECT * FROM cte ) ;
此答案不需要 sort,並且不使用連接。
UNION ALL
兩個查詢在一起。- 向聯合中添加一個排序列。
ORDER BY
那個排序- 取前 1 個但包括平局,因此所有第一個查詢或所有第二個查詢。
這不使用排序,因為編譯器辨識出查詢已經排序並使用
Merge Concatenation
。SELECT TOP (1) WITH TIES lineId FROM ( SELECT lineId, 1 AS ordering FROM table_name WHERE lineId = 80 UNION ALL SELECT lineId, 2 FROM table_name WHERE lineId = 0 ) t ORDER BY ordering;
另一種選擇是從
VALUES
表中的虛擬行開始,然後左連接查詢的前半部分。然後,在一個 內APPLY
,對另一半做同樣的事情。SELECT lineId = ISNULL(FirstHalf.lineId, SecondHalf.lineId) FROM (VALUES(1)) v(dummy) LEFT JOIN dbo.table_name AS FirstHalf ON FirstHalf.lineId = @ToFind OUTER APPLY ( SELECT TN.lineId FROM (VALUES(1)) v2(dummy) LEFT JOIN dbo.table_name AS TN ON TN.lineId = 0 AND FirstHalf.lineId IS NULL ) AS SecondHalf WHERE ISNULL(FirstHalf.lineId, SecondHalf.lineId) IS NOT NULL;
或略有不同
OUTER APPLY ( SELECT TOP (1000000000) TN.lineId FROM dbo.table_name AS TN WHERE TN.lineId = 0 AND FirstHalf.lineId IS NULL ) AS SecondHalf;
這個版本的好處是它根本不查詢後半部分,而我的另一個選項將由於合併而從兩半中至少拉出一行。
您需要非常仔細地閱讀執行計劃以確保發生這種情況:它需要
Filter
在主連接的下側帶有啟動謂詞。