SQL Server:仅当两个值都不为空时才比较它们

时间:2014-12-09 08:07:00

标签: sql sql-server

我尝试做的事情是比较两列,但前提是它们都不为空。

更详细地说,我想让product_idsproduct_id,color_id表格中的所有stockpricenull {{ 1}}在其中任何一个。

我想出了这个似乎做的工作:

color_id

但我想知道是否有更优雅的解决方案。

谢谢。

4 个答案:

答案 0 :(得分:0)

我想你可以这样做。 我不知道查询的性能因为我对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)

我希望这个答案可以帮到你。

注意:此查询未经过测试

答案 1 :(得分: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
);

答案 2 :(得分:-1)

未经测试,但应该有效:

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

答案 3 :(得分:-1)

声明没有任何问题,不应修改。

将函数应用于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