【问题标题】:SQL FUNCTION LIKE SEARCH ISSUESQL FUNCTION LIKE SEARCH ISSUE
【发布时间】:2019-12-31 08:41:08
【问题描述】:

请帮忙修复我的sql函数!

在我的 sql 函数中,我有一个临时表

参数传递给函数@searchstring ---- "'%carrots%' AND tmp.ItemDescription like '%baby%'"

Declare  @tempvalues table  (itemdescription nvarchar(max))

@tempvalues  VALUES

-----------------------

CARROTS, BABY, CLASS I, FRESH
CARROTS, BABY, FROZEN
CARROTS, CLASS I, FRESH

------------------

所以在函数 iam 中传递值以使用类似查询搜索数据,如果匹配,我需要在另一个表中插入数据 喜欢

在下面的 temptable 中如果匹配我需要插入 1 作为对应的行

Declare  @tempfinal table  (itemdescription nvarchar(max),matchcontains int)

**insert into @tempfinal select ItemDescription,'1'as matchcontains  from  @tempvalues tmp where tmp.ItemDescription like @searchstring**  

但@tempfinal 中没有插入任何内容

我需要搜索所有匹配的单词

请帮忙寻找解决办法

示例函数

CREATE FUNCTION dbo.UDF_PredictItems_testfreetextdemo  
(  
 @FTSExpression    NVARCHAR(4000) 
)
RETURNS @Result TABLE   
(

  itemdescription  NVARCHAR(4000),
  matchcontains int

)  
AS  
BEGIN           
 Declare  @tempvalues table  (itemdescription nvarchar(max))                    
 insert into @tempvalues values ('CARROTS, BABY, CLASS I, FRESH') ,
 ('CARROTS, BABY, FROZEN 2.5 KGS') ,
 ('CAKE, CARROT, FROZEN 1 KGS') ,
 ('CARROTS, CLASS I, FRESH')  


 declare @containExpression nvarchar(max)
 set @containExpression =replace(replace(replace(@FTSExpression,' ','<>'),'><',''),'<>',' ') 
 set @containExpression=(Select  replace(@FTSExpression, ' ', '%'))   
 set @containExpression=(Select  replace(@containExpression, ' ', ' AND tmp.ItemDescription like ')) 
 set @containExpression=(select '''%'+@containExpression+'%''')  




  declare @tempfinal table(ItemDescription nvarchar(max),matchcontains int)      
  insert into @tempfinal select ItemDescription,CAST('1' AS INT) as matchcontains  from  @tempvalues tmp where tmp.ItemDescription like @containExpression    

   insert into @Result ( itemdescription,matchcontains )           
   select  itemdescription,0 from @tempfinal

   return;
   END

调用函数

SELECT * from UDF_PredictItems_testfreetextdemo('Carrots baby')

【问题讨论】:

  • 你在用SQL Server吗?
  • 是的,我正在使用 SQL SERVER
  • 你能把你的代码给我here吗?
  • 我已经检查过了,它对我来说很好用。 ibb.co/rMCBMqh
  • 我在我的问题中添加了我的示例函数,你能检查一下

标签: sql-server wildcard temp-tables sql-function


【解决方案1】:

我已经检查了你所描述的 LIKE 运算符,这对我来说很好。

Declare  @tempvalues table  (itemdescription nvarchar(max))

INSERT INTO @tempvalues  
VALUES ('CARROTS'), ('BABY'), ('CLASS I'), ('FRESH'),('CARROTSI'), ('BABYI'), ('FROZENI'), ('CARROTSI'), ('CLASS I'), ('FRESH')

DECLARE @searchstring NVARCHAR(50) = '%carrots%'
SELECT * FROM @tempvalues WHERE itemdescription LIKE @searchstring

输出:

胡萝卜

胡萝卜

胡萝卜

查看我的结果here

更新

所以问题不在LIKE 运算符中,作为@Antonios Katopodis 的答案,您应该插入int 而不是varchar 类型

修复后更新

你的问题在这里

set @containExpression=(select '''%'+@containExpression+'%''')

你应该这样修复

set @containExpression=(select '%'+@containExpression+'%')  

【讨论】:

  • 类似搜索正在工作的查询/新查询窗口,但如果我创建函数则它不起作用
  • 我已经解决了,你的问题在这里set @containExpression=(select '%'+@containExpression+'%') 而不是set @containExpression=(select '''%'+@containExpression+'%''')
  • 感谢您的回复,它的部分工作,.. 如果我将参数更改为“小胡萝卜”结果为空,仍有一些问题
  • 实际上它的 2000+ 行函数,正如你提到的,我更改了查询,然后它为“胡萝卜宝宝”工作,但如果我通过“胡萝卜宝宝”结果为空,我需要与“胡萝卜宝宝”相同的结果
【解决方案2】:

您的查询是

INSERT INTO @tempfinal
SELECT 
   ItemDescription,
  '1' as matchcontains
FROM @tempvalues tmp
WHERE tmp.ItemDescription like @searchstring**

问题在于您尝试将 char 插入 int 字段。 所以试试这个:

INSERT INTO @tempfinal
SELECT 
   ItemDescription,
  CAST('1' AS INT) as matchcontains
FROM @tempvalues tmp
WHERE tmp.ItemDescription like @searchstring**

或者

INSERT INTO @tempfinal
SELECT 
   ItemDescription,
  1 as matchcontains
FROM @tempvalues tmp
WHERE tmp.ItemDescription like @searchstring**

【讨论】:

  • 我试过了但是不行,问题是如果我传了两个词“胡萝卜宝贝”那么它就不行了
猜你喜欢
  • 2011-04-06
  • 1970-01-01
  • 2022-12-02
  • 1970-01-01
  • 2012-05-23
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
相关资源
最近更新 更多