TSQL-在多列中搜索单个值

时间:2019-03-06 14:08:29

标签: tsql barcode

我们的数据库具有以下项目信息:

ItemNumber | ItemDescription | CaseUPC        | BoxUPC         | UnitUPC
===============================================================================
12345      | Widget          | 00487060982629 | 00334556905837 | 00803709021138
23456      | Dunkit          | 00442765157512 | 00688083046260 | 00148006723652
34567      | Tiklet          | 00671178066801 | 00181369288501 | 00371783583016

我们收到的客户信息通常如下所示:

ItemNumber | UPC
=========================
XPQR       | 487060982629
ROFL       | 688083046260
WTAF       | 371783583016
LOLBBQ     | 123456789012

因为我们的大多数客户都不懂计算机,而是使用Excel创建他们发送给我们的CSV文件,所以缺少UPC代码的前导零,但它们是有效的代码。

使用SQL Server 2012,我的任务是将客户提供的UPC代码与我们的Item表进行匹配,以生成如下所示的报告:

CustomerItemNumber | OurItemNumber | OurItemDescription | MatchMethod
======================================================================
XPQR               | 12345         | Widget             | CaseUPC
ROFL               | 23456         | Dunkit             | BoxUPC
WTAF               | 34567         | Tiklet             | UnitUPC
LOLBBQ             | --            | --                 | no match found

我尝试从客户项目表到我们的项目表使用多个LEFT JOINS:

SELECT C.ItemNumber,
        O.ItemNumber, 
        O.ItemDescription,
        O.CaseUPC,
        O.BoxUPC,
        O.UnitUPC
FROM CustomerItemTable C
    LEFT OUTER JOIN OurItemTable O ON RIGHT('000000000000' + LTRIM(RTRIM(C.UPC)), 12) = RIGHT('000000000000' + LTRIM(RTRIM(O.CaseUPC)), 12)
    LEFT OUTER JOIN OurItemTable O2 ON RIGHT('000000000000' + LTRIM(RTRIM(C.UPC)), 12) = RIGHT('000000000000' + LTRIM(RTRIM(O2.BoxUPC)), 12)
    LEFT OUTER JOIN OurItemTable O3 ON RIGHT('000000000000' + LTRIM(RTRIM(C.UPC)), 12) = RIGHT('000000000000' + LTRIM(RTRIM(O3.UnitUPC)), 12)

...但是我最终得到了重复的记录

2 个答案:

答案 0 :(得分:1)

我不太确定为什么要一遍又一遍地连接同一张表-您可以在多个列上使用带有条件的单个联接。 另外,您可以通过强制转换为int来摆脱所有前导零:

SELECT C.ItemNumber,
        O.ItemNumber, 
        O.ItemDescription,
        O.CaseUPC,
        O.BoxUPC,
        O.UnitUPC
FROM CustomerItemTable C
LEFT OUTER JOIN OurItemTable O 
ON CAST(C.UPC AS int) IN(CAST(O.CaseUPC AS INT), CAST(O.BoxUPC AS INT), CAST(O.UnitUPC AS INT))

当然,如果您要在CustomerItemTable上的UPC与OurItemTable上的CaseUPC,BoxUPC或UnitUPC中的任何一个相匹配时,就假定要联接表。

答案 1 :(得分:0)

如果您知道该列仅包含数字数据,请在联接中将其转换:

... CONVERT(INT, UPC) ...

否则,请使用LIKE而不是equals

... LIKE upc + '%' ...

此外,您可能只应使用多个WHERE子句将表连接一次。