[英]SQL Server: compare two values only if none of them is null
我想做的事情是比較兩列,但前提是沒有一個為null。
更具體地說,我想所有的product_ids
有一個product_id,color_id
均對stock
和price
表或一個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)
該語句沒有任何問題,不應對其進行修改。
將函數應用於JOIN
或WHERE
子句中的參數可防止查詢優化器使用任何基礎索引,從而強制進行全表掃描,而不是便宜得多的索引查找。
此外,該語句還說返回值與顏色匹配,包括沒有顏色的返回值 。 在這種情況下, NULL
用作通配符。 使用ISNULL
或COALESCE
任何修改還將修改邏輯,以僅返回匹配的內容或沒有顏色的內容 。 這等效於:
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.