Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sql server中执行某种“反向查找”_Sql_Sql Server - Fatal编程技术网

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

在sql server中执行某种“反向查找”,sql,sql-server,Sql,Sql Server,我有一个规格编号表,当表格生成时,需要在打印表格上输入额外的注释。生成该表单时,我有一个产品列表及其相关的规格编号。一些普通的产品只是普通的8位数字,我可以很容易地在我的注释表中搜索匹配的规范号,并提取相应的注释。但也有附加后缀的特殊产品,例如52498762与52498762-A4。根据使用的后缀有两个或三个,任何带有该后缀的产品都需要列出注释。但是,在设置注释表时,spec字段仅具有后缀,而不是使用该后缀指定每个单独的spec编号。例如: SpecID | Comment -----

我有一个规格编号表,当表格生成时,需要在打印表格上输入额外的注释。生成该表单时,我有一个产品列表及其相关的规格编号。一些普通的产品只是普通的8位数字,我可以很容易地在我的注释表中搜索匹配的规范号,并提取相应的注释。但也有附加后缀的特殊产品,例如52498762与52498762-A4。根据使用的后缀有两个或三个,任何带有该后缀的产品都需要列出注释。但是,在设置注释表时,spec字段仅具有后缀,而不是使用该后缀指定每个单独的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”行中列出注释。我可以有200个以-A4结尾的规格,它们都会得到相同的评论。是否有一种方法可以编写与表内容的通配符版本匹配的查询?我知道,通常情况下,表中的固定值与用户提供的通配符值相匹配;我需要的是一个静态用户提供的值和一个通配符表值。这可能吗?

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

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字符串中“-”之前的所有字符。并将其与comments表上的SpecID匹配?这就是你想要的吗?

为什么不同时得到两组评论

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,另一列仅包含足够的内容。这些列上的索引可能会有所帮助

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

是否所有后缀都由-分隔?在您的应用程序中,您应该能够分离规格编号和后缀。可以使用SELECT Comment FROM表格检索注释,其中SpecID=@SpecID或SpecID=@Suffix。听起来好像后缀优先于SpecID,因此,查询应该是SELECT Comment FROM Table WHERE SpecID=CASE WHERE@Suffix=THEN@SpecID ELSE@Suffix END请稍微描述一下SpecID和SUFFIFES的格式。如果他们有某种一致的构成,使他们能够可靠地被区分,这将很容易。@Erik-你看到的就是他们。它们总是至少有8个数字,在大多数情况下,它们就是这样。如果它们是不同的,它将是一个两个字符的后缀,由一个-。我认为Chris的解决方案是可行的——在某些情况下,我可能需要通用后缀注释以及特定规范编号的特定注释,将它们拆分成代码并通过存储过程将这两个部分输入,这几乎就是我所需要的。第一个查询确实提取了所有正确的注释,我通过对整个产品表运行它来测试它。我很想将它添加到我存储的proc中,该proc将数据从几个不同的表拉到一个产品摘要行中,但存在一种可能性,即我可能对给定的产品规范有两个注释,此时我的proc将返回两行。我可能不得不将其作为一个单独的过程,并处理代码中出现多个注释的可能性。无论如何,这就是我需要的!