簡體   English   中英

SQL Server:僅當兩個值都不為空時才比較兩個值

[英]SQL Server: compare two values only if none of them is null

我想做的事情是比較兩列,但前提是沒有一個為null。

更具體地說,我想所有的product_ids有一個product_id,color_id均對stockprice表或一個null color_id在其中任何一個。

我想出了這似乎可以做的工作:

SELECT DISTINCT 
    stock.product_id product_id
FROM  
    stock, price
WHERE
    stock.product_id = price.product_id 
    AND
    (stock.color_id = price.color_id 
     OR price.color_id IS NULL OR stock.color_id IS NULL)

但我想知道是否有更優雅的解決方案。

謝謝。

我認為您可以這樣做。 我不知道查詢Coz的性能我對SQl的性能不熟悉。 但是我認為Subquery將是您的理想選擇。

這是可能對您有幫助的查詢。

SELECT
*
FROM
(
SELECT 
    DISTINCT 
    stock.product_id Stock_ProductId,
    price.product_id Price_ProductId,
    isnull(stock.color_id,0) Stock_color_id,
    isnull(price.color_id,0) Price_color_id,
FROM  
    stock 
    ,price
) AS A
WHERE
    Stock_ProductId = Price_ProductId 
AND
    ( Stock_color_id = Price_color_id OR Price_color_id  = 0 OR Stock_color_id  = 0)

希望這個答案對您有所幫助。

注意:此查詢未經測試

這是另一種觀點。 您可能有一種具有十種顏色的產品,其中七種有現貨,六種有價格,四件匹配。 找到一場比賽就足夠了。 那為什么要全部匹配呢? 然后甚至必須使用DISTINCT擺脫多個匹配項?

以下本質上是您的選擇,僅放在EXISTS子句中。 dbms可以利用此功能並使用快速查找循環。 我想這取決於表中有多少種產品和多少種顏色,這是否更快。

select id
from product
where exists
(
  select * 
  from stock s
  join price p 
    on s.product_id = p.product_id 
    and (s.color_id = p.color_id or p.color_id is null or s.color_id is null)
  where s.product_id = product.id
);

未經測試,但應該可以工作:

where ... and coalesce(stock.color_id, price.color_id, 0) = coalesce(price.color_id, stock.color_id, 0)

該語句沒有任何問題,不應對其進行修改。

將函數應用於JOINWHERE子句中的參數可防止查詢優化器使用任何基礎索引,從而強制進行全表掃描,而不是便宜得多的索引查找。

此外,該語句還說返回值與顏色匹配,包括沒有顏色的返回值 在這種情況下, NULL用作通配符。 使用ISNULLCOALESCE任何修改還將修改邏輯,以僅返回匹配的內容或沒有顏色的內容 這等效於:

stock.color_id = price.color_id OR (price.color_id IS NULL AND stock.color_id IS NULL)

如果Color_Id包含No Color的特殊值,例如-1 ,則可以簡化此語句。 在這種情況下,您可以簡單地寫

stock.color_id = price.color_id

但是,這不會簡化原始語句,因為邏輯要求您檢查兩個表的“ No Color

暫無
暫無

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

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