在列中搜索另一列中的值LIKE

时间:2014-01-06 20:21:08

标签: sql sql-server sql-server-2008 tsql

我搜索但找不到我要找的东西,也许我不是在寻找合适的条款。

我有SKU的列和关键字列,SKU的格式为AA 12345,而关键字只是单词的长列表,我需要做的是查找SKU中的数字与任何部分匹配的任何记录关键词,我只是不知道该怎么做。例如,我想删除AA,以便我在关键字值的任何地方寻找%12345%,但我需要为每条记录执行此操作。

我尝试了几种变体:

SELECT *, Code AS C FROM Prod WHERE Keywords LIKE '%C%';

但我在所有这些方面都遇到了错误。有人可以帮忙吗?

谢谢。

编辑:好的,对不起,这个问题并不是最清楚的。我会试着澄清一下;

SKU列的值在不同数量的前面有2个字母前缀,例如AA 12345或UN 98767865

关键字列充满了信息,但也包含了SKU值,这里的问题是某些关键字列包含具有完全不同记录的产品的SKU值

我正在尝试查找哪些列包含不同记录的值。

我希望这更容易理解。

编辑编辑:这是一些实际的样本数据

Code: AD 56409429
Keywords: 56409429, 409249, AD 56409429, AD-56409429, Advance 56409429, Nilfisk 56409429, Nilfisk Advance 56409429, spx56409429, 56409429M, 56409429G, 56409429H, ADV56409429, KNT56409429, Kent 56409429, AA 12345

Code: AA 12345
Keywords: AA 12345, 12345, Brush

我需要找到错误代码值已经发现它进入关键字的所有记录,例如上面的第一个案例,所以我需要一个只返回第一个例子的查询

我真的很抱歉我的解释令人困惑,这可能是我试图弄清楚如何去做的困难的延伸。想象一下,我和网站所有者一起坐在那里,他们在关键字中添加了数千个这些额外的sku数字,让他们让我删除它们:/

2 个答案:

答案 0 :(得分:3)

假设您的所有SKU值都采用完全相同的格式,您可以使用SUBSTRING删除'AA'部分,然后在LIKE语句中使用结果:

SELECT * FROM Prod WHERE Keywords LIKE '%' + SUBSTRING(Code, 3,5) + '%'

鉴于您的SKU代码可以是可变长度,上面的SUBSTRING语句必须更改为:

SELECT * FROM Prod WHERE Keywords LIKE '%' + SUBSTRING(Code, 3, LEN(Code)) + '%'

这将删除SKU代码中的前3个字符,无论其后面包含的位数如何。

从您的问题来看,关键字的格式是AA 12345还是仅12345还不完全清楚,但假设它们是以逗号分隔的。然后,您可以使用以下语句找到代码在关键字中的所有记录,但也有其他关键字:

SELECT * 
 FROM Prod 
   WHERE Keywords LIKE '%' + SUBSTRING(Code, 3, LEN(Code)) + '%'
     AND Keywords <> SUBSTRING(Code, 3, LEN(Code))

这句话基本上说找到我所有记录,其中SKU代码在关键字中的某处,但也不能与关键字内容完全匹配,即数据中必须有其他关键字。

根据您的最新修订,我认为这将有效 - 或者至少让您顺利进行(我假设您的Product表具有Id的主键)。此外,这很可能是非常低效的,但看起来好像这是一次性的整理,只要它起作用可能并不重要(至少这是我所希望的)。

SELECT DISTINCT P.Id
  FROM PROD P
    INNER JOIN 
    (
      -- Get all unique SKU codes from Prod table
      SELECT DISTINCT SUBSTRING(CODE, 3, LEN(CODE)) as Code FROM Prod
    ) C ON P.Keywords LIKE '%' + C.Code + '%'
    AND SUBSTRING(P.Code, 3, LEN(P.Code)) <> C.Code

上述语句通过关键字列上的连接将每个匹配记录的唯一SKU代码列表(删除了字母前缀)加入。注意:这将导致返回重复的产品记录。此外,结果集被过滤,以便仅返回匹配记录,其中原始产品记录的SKU代码与关键字列中包含的SKU代码不匹配。 然后,distinct返回仅在关键字列中具有错误SKU代码的产品ID的唯一列表(它们可能具有倍数)。

答案 1 :(得分:0)

Stuff()似乎更适合......我会这样做:

SELECT * 
FROM Prod WHERE 
Keywords LIKE '%' + STUFF(SKU,1,3,'') + '%'

这适用于AA 12345UN 98767865 - 它会将前3个字符替换为空白。