想要通過實現空格分隔的多個關鍵詞模糊查詢貨品資料-任一匹配和全部匹配
創建存儲過程,根據傳入的字符串,以空格分隔之后分詞查詢
貨品代號、名稱、規格、圖號、材質等多列信息中,至少匹配了一個關鍵詞的貨品
幾個動作
1、建立分割字符串獲取關鍵詞並生成一個數據表的函數
--創建函數,以空格分隔字符串,返回一個表變量,方便與數據表進行查詢連接 CREATE FUNCTION GETRECORDS(@STR VARCHAR(2000)) RETURNS @REC TABLE (RECORD VARCHAR(2000)) AS -- SELECT * FROM DBO.GETRECORDS('200g 哈哈 呵呵 呵呵 316L 2333 ') BEGIN DECLARE @REC1 TABLE (RECORD VARCHAR(2000)) DECLARE @S VARCHAR(2000) DECLARE @R VARCHAR(2000) DECLARE @I VARCHAR(2000) --傳進來的參數先進行處理,去掉前后的空格,防止出錯 SET @S=LTRIM(RTRIM(ISNULL(@STR,''))) --獲取第一個空格在字符串中的位置,有空格,則不為0 SET @I=CHARINDEX(' ',@S) --對目標字符串進行分隔,插入到返回表中 WHILE @I>0 BEGIN --從目標字符串中抓取左邊的第一個分詞, --即:截取從第一個字符開始,到第一個分隔符(空格)所在位置之前一位的字符 SET @R=LEFT(@S,@I-1) --寫入到返回表中 INSERT @REC1 VALUES (@R) --目標字符串刪掉第一個分詞和第一個分隔符(空格),剩余部分繼續分割處理 --即:截取從最后一個字符開始,到最后一個分隔符(空格)所在位置之后一位的字 SET @S=RIGHT(@S,LEN(@S)-@I) --獲取剩余字符串中,第一個分隔符(空格)在字符串中的位置,有空格,則不為0 SET @I=CHARINDEX(' ',@S) END --循環處理完畢,若目標字符串長度不為0,則說明是最后一個分詞了,直接寫入返回表 IF LEN(@S)>0 INSERT @REC1 VALUES (@S) --分隔結果去重,並且去掉其中的空格 INSERT INTO @REC (RECORD) SELECT DISTINCT RECORD FROM @REC1 WHERE RECORD<>' ' --返回表變量 RETURN END GO
2、建立視圖,多個關鍵詞聯合到一起
--創建視圖 拼接要查詢的列到一起,便於比對,用戶需要增加查詢的列范圍,只需要修改視圖即可 CREATE VIEW VNPRDT AS --SELECT * FROM VNPRDT SELECT ISNULL(P.PRD_NO,'') PRD_NO, ISNULL(P.NAME,'') NAME, ISNULL(CAST(P.SPC AS VARCHAR(1000)),'') SPC, ISNULL(P.UT,'') UT,ISNULL(P.PICNO,'') PICNO, ISNULL(P.MATERIALKIND,'') MATERIALKIND, ISNULL(P.PRD_NO,'')+ISNULL(P.NAME,'')+ISNULL(CAST(P.SPC AS VARCHAR(1000)),'')+ISNULL(P.UT,'')+ISNULL(P.PICNO,'')+ISNULL(P.MATERIALKIND,'') SERCHKEY FROM PRDT P WHERE 1=1 GO
3、建立存儲過程,最終實現查詢
CREATE PROC SP_PRDTSEARCH @KEYWORDS NVARCHAR(2000), @I INT=1 AS BEGIN -- EXEC SP_PRDTSEARCH '225 花生 EEE W2 嘎嘎',1 -- EXEC SP_PRDTSEARCH '225 花生',1 -- EXEc SP_PRDTSEARCH N'225g', 0 --創建存儲過程,根據傳入的字符串,以空格分隔之后分詞查詢 --貨品代號、名稱、規格、圖號、材質等多列信息中, --至少匹配了一個關鍵詞的貨品 DECLARE @KEYNUMBER INTEGER --根據參數傳入方式,@I=0 則任意一個關鍵詞匹配即可(OR模式);若@I<>0,則必須匹配所有關鍵詞才行(AND模式) IF @I<>0 BEGIN --采用ND模式,獲取關鍵詞個數,所有關鍵詞必須全部匹配 SELECT @KEYNUMBER=COUNT(*) FROM DBO.GETRECORDS(@KEYWORDS) END ELSE BEGIN --采用OR模式,任意一個及一個以上關鍵詞匹配即可 SELECT @KEYNUMBER=1 END IF ISNULL(@KEYWORDS,'*')='*' BEGIN SELECT PRD_NO, [NAME], SPC, PICNO, MATERIALKIND, 1 FINDTIMES FROM VNPRDT WHERE 1=1 END ELSE BEGIN SELECT * FROM ( SELECT PRD_NO, [NAME], SPC, PICNO, MATERIALKIND, COUNT(CHARINDEX(B.RECORD,A.[NAME])) FINDTIMES FROM VNPRDT A,DBO.GETRECORDS(@KEYWORDS) B WHERE CHARINDEX(B.RECORD,A.SERCHKEY)>0 GROUP BY A.PRD_NO,A.[NAME],SPC,PICNO,MATERIALKIND ) P1 WHERE P1.FINDTIMES>=@KEYNUMBER ORDER BY P1.FINDTIMES END END GO
調用時,SP_PRDTSEARCH的參數 @I 用於區分是全部匹配還是任意一個匹配即可。
SQL SERVER 2000數據庫,測試了FAS2000系列、SUNLIKE系列、天心、天思、有利、GXXX KERP等同系源ERP產品P的貨品資料表,可用。
