在sql server中执行某种“反向查找”

时间:2011-06-06 15:51:37

标签: sql sql-server

我有一个规格编号表,需要在生成表单时在打印表单上输入其他注释。当我生成该表单时,我有一个产品列表及其相关的规格编号。一些“普通”产品只是普通的旧八位数字,我可以轻松地在我的评论表中搜索匹配的规格编号并提取相应的评论。但也有附加后缀的“特殊”产品(例如,52498762与52498762-A4)。根据使用的后缀(有两个或三个),带有该后缀的任何产品需要列出的注释。但是,当设置注释表时,不是使用该后缀指定每个单独的规范编号,spec字段只有后缀。例如:

SpecID    |  Comment
------------------------------------------------------
52498762  |  Comment for a specific spec number
52746627  |  Comment for a different spec number
A4        |  Comment for any spec that ends with '-A4'

因此,在此示例中,如果我的规范编号为52196748-A4,则需要注释表的“A4”行中列出的注释。我可能有两百个以-A4结尾的规格,他们都会得到相同的评论。有没有办法编写与表内容的通配符版本匹配的查询?我知道通常一个表中的固定值与通配符用户提供的值匹配;我需要的是静态用户提供的值和通配符表值。这甚至可能吗?

2 个答案:

答案 0 :(得分:0)

我真的不知道你的布局,但......

SELECT
    p.ProductID,
    p.ProductName,
    c.CommentText
FROM
    Products p
    INNER JOIN Comments c
        ON 
           RIGHT(p.ProductID, LEN(p.ProductID) - CHARINDEX('-', p.ProductID))
           = 
           c.SpecID

因此,应该在ProductID字符串中的' - '之前提供所有字符。并将其与评论表上的SpecID相匹配?那是你在找什么?

答案 1 :(得分:0)

为什么不一次获得两组评论?

SELECT
   ...
FROM
   Products P
   LEFT JOIN Comments C
      ON P.ProductID LIKE C.SpecID + '%'
      OR P.ProductID LIKE '%-' + C.SpecID

你也可以考虑:

SELECT
   ...
FROM
   Products P
   LEFT JOIN Comments C
      ON (Len(C.SpecID) = 2 AND P.ProductID LIKE C.SpecID + '%')
      OR (Len(C.SpecID) > 2 AND P.ProductID LIKE '%-' + C.SpecID)

测试是为了看一个人是否比另一个人表现更好。如果您发现查询太慢,请尝试添加一些持久计算列:在产品中指定产品ID是否包含破折号,并在“注释”中添加两列,一列仅包含产品ID,另一列仅包含产品ID就足够了。这些列的索引可能有所帮助。

ALTER TABLE Comments ADD ExactSpecID AS 
   (CASE WHEN Len(SpecID) > 2 THEN SpecID ELSE NULL END) PERSISTED
ALTER TABLE Comments ADD Suffix AS 
   (CASE WHEN Len(SpecID) = 2 THEN SpecID ELSE NULL END) PERSISTED