Sql 如何在我的特定表中搜索逗号分隔字符串的4个字符,在其他表中搜索超过4个字符的单词

Sql 如何在我的特定表中搜索逗号分隔字符串的4个字符,在其他表中搜索超过4个字符的单词,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,我的意见如下: 塑料、石膏、电气 ipad 我有两张桌子: 用户详细信息:名字,服务描述,技能 分类管理员:ID,名称 我正在用逗号拆分字符串,并将一个字一个字地匹配到我的两个表中的字段servicescription、Skills、Name(类别名称) 所以现在,当我的输入字符串包含逗号时,我希望字符串中的4个字符的单词在CategoryMaster表中仅在Name字段上匹配 类似于输入1: Plas:仅在CategoryMaster表的名称字段上匹配 石膏:匹配服务描述,技能,名称 elec

我的意见如下:

  • 塑料、石膏、电气
  • ipad
  • 我有两张桌子:

  • 用户详细信息:名字,服务描述技能
  • 分类管理员:ID,名称
  • 我正在用逗号拆分字符串,并将一个字一个字地匹配到我的两个表中的字段servicescriptionSkillsName(类别名称)

    所以现在,当我的输入字符串包含逗号时,我希望字符串中的4个字符的单词在CategoryMaster表中仅在Name字段上匹配

    类似于输入1

    Plas:仅在CategoryMaster表的名称字段上匹配

    石膏:匹配服务描述技能名称

    elec:仅在CategoryMaster表的名称字段上匹配

    对于输入2

    由于我的第二次输入不包含任何逗号,这意味着它是一个完整的单词,因此:

    ipad:仅在CategoryMaster表的名称字段上匹配

    例如:

    输入1:wordPlas

     WHERE c.Name LIKE '%plas%'
    
    输入1:word石膏

    WHERE ((u.ServiceDescription LIKE '%plaster%') OR (u.Skills LIKE '%plaster%') OR 
                                      (c.Name LIKE '%plaster%')
    
    这是我的存储过程:

    ALTER PROCEDURE [dbo].[SearchworkerProcedure]
        @SearchKeyword nvarchar(70)
    
    AS
        DECLARE @I INT
            DECLARE @keyname nvarchar(50)
            DECLARE @totalRecords INT
    
    
        DECLARE @Keywords TABLE
       (    
          sno INT IDENTITY(1,1) PRIMARY KEY,
          keyname VARCHAR(100) ,
          isSplitted int
        )
    
        DECLARE @SearchKeywordTable TABLE
        (
            [VendorId] [int]  NULL,
                [ServiceDescription] [nvarchar](max) NULL,
                [Skills] [nvarchar](max) NULL
        )
     INSERT INTO @Keywords SELECT * FROM [splitstring_to_table](@SearchKeyword,@sep)
    
    BEGIN   
            IF (len(@SearchKeyword) > 0)
                BEGIN           
                    SELECT @I = 1
                    SELECT @totalRecords = COUNT(*) FROM @Keywords
                    WHILE (@I <= @totalRecords)
                    BEGIN
                        SET @keyname = (SELECT keyname FROM @Keywords WHERE sno = @I)   
                        Insert INTO @SearchKeywordTable                                     
                            SELECT *
                            FROM UserDetails u 
                            INNER JOIN VendorInCategory v ON v.VendorId=u.Id 
                            INNER JOIN CategoryMaster c ON v.CategoryId=c.Id 
                            WHERE (
                            (len(@keyname) > 0) and
                            (u.ServiceDescription LIKE '%'+@keyname+'%') OR (u.Skills LIKE '%'+@keyname+'%') OR 
                                      (c.Name LIKE '%'+@keyname+'%')
                                      )
                            ORDER BY ISNULL(r.RatingValue, 0) DESC;         
                            SELECT @I = @I + 1 
    
                    END
                    SELECT DISTINCT VendorId,*  FROM @SearchKeywordTable                    
                END
    
    ALTER过程[dbo].[SearchworkerProcedure]
    @搜索关键字nvarchar(70)
    像
    声明@I INT
    声明@keyname nvarchar(50)
    声明@totalRecords INT
    声明@Keywords表
    (    
    sno INT标识(1,1)主键,
    键名VARCHAR(100),
    IsSplited int
    )
    声明@SearchKeywordTable表
    (
    [VendorId][int]NULL,
    [ServiceDescription][nvarchar](最大值)NULL,
    [技能][nvarchar](最大值)空
    )
    插入到@Keywords中,从[splitstring_to_table]中选择*(@SearchKeyword,@sep)
    开始
    如果(len(@SearchKeyword)>0)
    开始
    选择@I=1
    从@Keywords中选择@totalRecords=COUNT(*)
    而(@i0)和
    (u.ServiceDescription,如“%”++@keyname++“%”)或(u.Skills,如“%”++@keyname++“%”)或
    (c.Name类似“%”++@keyname++“%”)
    )
    按ISNULL(r.额定值,0)说明排序;
    选择@I=@I+1
    终止
    从@SearchKeywordTable中选择不同的VendorId,*
    终止
    
    任何人都可以帮忙吗?

    你可以这样写:

    WHERE 1 = case when len(@keyname) = 4 and c.Name LIKE '%'+@keyname+'%' then 1 
                   when (u.ServiceDescription LIKE '%'+@keyname+'%') 
                        OR (u.Skills LIKE '%'+@keyname+'%') then 1 end
    

    不需要while。从此过程中删除不必要的表和列。它应该可以工作。它比以前的查询快,但如果由于以下原因导致记录太多,则速度可能会更慢

    • 像“%”++@keyname++“%”而不是像@keyname++“%”那样只创建 这些列上没有CI

    • 使用全文搜索(在msdn中读取)

    更改过程[dbo]。[SearchworkerProcedure] @搜索关键字nvarchar(70)

    开始

                        SELECT *
                        FROM UserDetails u 
                        INNER JOIN VendorInCategory v ON v.VendorId=u.Id 
                        INNER JOIN CategoryMaster c ON v.CategoryId=c.Id
                        CROSS APPLY ( SELECT * FROM @Keywords)Fn
                        WHERE 
                        (u.ServiceDescription LIKE '%'+Fn.keyname+'%') OR (u.Skills LIKE '%'+Fn.keyname+'%') 
                        OR c.Name LIKE '%'+Fn.Shortkeyname+'%')
    
                        ORDER BY ISNULL(r.RatingValue, 0) DESC;     
                        --wht is  RatingValue ?it is in which table.   
    
    
    
                        END
    

    您没有提到从哪个位置到子字符串4字符。例如,如果输入为“石膏”,则4字符将为Plas,斯特还是什么?我从服务器端传递这个字符串,我的逻辑是,如果字符串长度大于4,则将字符串拆分为4个字符,并将这4个字符附加到原始字符串:例如,原始字符串是石膏,然后将石膏拆分为4个字符,这样它将成为plas,并用逗号将其附加到我的原始字符串,所以最后一个字符串变成:普拉斯,plastercan u请边写边循环逻辑,因为我在存储过程语法方面有很多问题,因为这是我的第一个存储过程,我不能使用全文搜索,因为全文搜索在azure上不起作用,因为免费的文本搜索我们必须购买许可证,所以我必须严格使用,就像我一个接一个地拆分一样按逗号输入单词并存储在关键字表中,然后在userdetail和category tbale中搜索。这样,如果没有while循环,该操作是否有效?@mariapithia,它将100%有效。可能是您需要修复的lil语法错误。就是这样。因此,如果要返回大量记录,请使用分页。@mariapithia,首先让它工作。它工作吗?问题在哪里?请参阅我的代码,插入关键字(keyname,IsSplited)值('Plast',0)是的,它正在工作,但我必须在哪个列上创建非ci,为什么?
                        SELECT *
                        FROM UserDetails u 
                        INNER JOIN VendorInCategory v ON v.VendorId=u.Id 
                        INNER JOIN CategoryMaster c ON v.CategoryId=c.Id
                        CROSS APPLY ( SELECT * FROM @Keywords)Fn
                        WHERE 
                        (u.ServiceDescription LIKE '%'+Fn.keyname+'%') OR (u.Skills LIKE '%'+Fn.keyname+'%') 
                        OR c.Name LIKE '%'+Fn.Shortkeyname+'%')
    
                        ORDER BY ISNULL(r.RatingValue, 0) DESC;     
                        --wht is  RatingValue ?it is in which table.   
    
    
    
                        END