SQL 空格分隔的多個關鍵詞模糊查詢貨品資料-任一匹配和全部匹配 數據庫實現方式


想要通過實現空格分隔的多個關鍵詞模糊查詢貨品資料-任一匹配和全部匹配

創建存儲過程,根據傳入的字符串,以空格分隔之后分詞查詢
貨品代號、名稱、規格、圖號、材質等多列信息中,至少匹配了一個關鍵詞的貨品

 

幾個動作

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的貨品資料表,可用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM