繁体   English   中英

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

[英]Search all columns for a given value in SQL Server and return only exact match

我有一个名为PRODUCTDATA表,该表包含以下数据:

在此处输入图片说明

为了得到prodctunitsPRODUCTDATA表从ET ,P1和ML列值可存在任何塔即产品1,产品2和产品3的。

我的查询是

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表中返回较低的值iw 8。

如何实现呢?

我认为您需要显式测试另一列是否没有其他值。 这是一种方法:

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) ;

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

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) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM