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
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中读取)
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