在SQL Server中搜索给定值的所有列,并仅返回完全匹配

时间:2018-03-11 00:54:39

标签: sql sql-server

我有一个名为PRODUCTDATA的表格,其中包含以下数据:

enter image description here

要从prodctunits PRODUCTDATA表中获取ET,P1和ML列值可以出现在任何列中,即product1,product2和product3。

我的查询是

select Productunits 
from PRODUCTDATA 
where 
    'P1' IN (PRODUCT1, Product2, product3) AND 
    'ET' IN (PRODUCT1, PRODUCT2, PRODUCT3) AND
    'ML' IN (PRODUCT1, PRODUCT2, PRODUCT3);

以产品单位

返回20

但是如果我的查询是

select Productunits 
from PRODUCTDATA 
where  
    'ML' IN (PRODUCT1, Product2, product3) and 
    'P1' IN (PRODUCT1, PRODUCT2, PRODUCT3);

它应该只返回15 Productunits,但此查询返回2行,20和15。

同样地,如果我搜索P1,那么它应该仅从PRODUCTDATA表返回较低值i.w 8。

如何实现这一目标?

2 个答案:

答案 0 :(得分:3)

我认为您需要明确测试其他列没有其他值。这是一种方法:

select Productunits
from PRODUCTDATA
where 'ML' in (product1, product2, product3) and
      'P1' in (product1, product2, product3) and
      (product1 in ('ML', 'P1') or product1 is null) and
      (product2 in ('ML', 'P1') or product2 is null) and
      (product3 in ('ML', 'P1') or product3 is null) ;

顺便提一下,如果您的数据结构已规范化并且每个产品只有一行,则此查询会更简单。

答案 1 :(得分:1)

select Productunits 
from PRODUCTDATA 
where  'ML' IN ( PRODUCT1,Product2,product3) 
and 'P1' IN (PRODUCT1,PRODUCT2,PRODUCT3);

此查询在前三列中的任意一列中搜索“ML”,在前三列中的任意一列中搜索P1。 'ML'和'PL'显示在第3行和第4行中。因此查询返回两个结果。

假设行#是表的主键或唯一标识符,那么您可以使用下面的查询。

SELECT Productunits
FROM PRODUCTDATA
WHERE id = 5

要在没有主键的情况下拉出此数据,请尝试使用CONCAT ...请注意,concat语法因您使用的DB类型而异。以下是MySQL语法。

SELECT Productunits
FROM PRODUCTDATA
where 'MLP1' in (SELECT concat(product2, product3) from productdata)