2011-06-06 39 views
0

我有一個規格編號表,當生成表單時需要在打印表單上輸入附加註釋。當我生成該表單時,我有一個產品列表及其關聯的規格編號。一些「普通」產品只是普通的舊八位數字,我可以輕鬆地在我的評論表中搜索匹配的規格編號並提取相應的評論。但也有「特殊」產品附加了後綴(例如,52498762與52498762-A4)。根據所使用的後綴(有兩個或三個),任何產品具有該後綴需要列出註釋。但是,當設置註釋表時,而不是使用該後綴指定每個單獨的規格編號,而規格字段只有後綴。例如:在sql server中執行某種「反向查找」

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結尾,他們都會得到相同的評論。有沒有辦法編寫一個匹配表內容的通配符版本的查詢?我通常知道,表中的一個固定值與通配符用戶提供的值相匹配;我需要的是一個靜態的用戶提供的值和一個通配符表值。這甚至有可能嗎?

+0

是否所有後綴都由'-'定界?在您的應用程序中,您應該能夠分開規格編號和後綴。可以使用'SELECT註釋從表WHERE SpecID = @SpecId或SpecId = @後綴'來檢索評論。 – 2011-06-06 15:58:35

+0

這聽起來好像後綴優先於SpecID,所以查詢應該是'SELECT Comment FROM Table WHERE SpecID = CASE WHEN @Suffix =''THEN @SpecID ELSE @Suffix END' – dpmattingly 2011-06-06 16:06:33

+0

請描述更多的格式你的SpecIDs和Suffices。如果他們有一種可以讓他們可靠辨別的一致化妝,這將很容易。 – ErikE 2011-06-06 16:38:56

回答

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 
+0

這幾乎是我所需要的。第一個查詢確實提取了所有正確的註釋(我通過在整個產品表上運行它來測試它)。我很想將它添加到我的存儲過程中,將數據從一些不同的表中抽取到一個產品摘要行中,但是可能存在的問題是我可能對給定的產品規格有兩條評論,此時,我的過程會返回兩行。我可能不得不將這個保存爲一個單獨的proc,並在我的代碼中處理多個註釋的可能性。無論如何,這是我需要的! – mounty 2011-06-07 13:50:30

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 

所以,應該給你之前的所有字符「 - 」在你的產品ID字符串。並將它匹配到評論表上的SpecID?那是你在找什麼?