Sql-Server

如何檢查 WHERE = value 是否不存在並預設為零?

  • September 7, 2022

我的目標是檢查 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;

db<>小提琴

粘貼計劃


另一種選擇是從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在主連接的下側帶有啟動謂詞。

引用自:https://dba.stackexchange.com/questions/316505