当前位置: 首页 > 面试题库 >

如何用and的and or编写containstable搜索条件

荆运诚
2023-03-14
问题内容

当前试图用a编写select语句,containstable并且搜索条件使我有些悲痛。

目的是搜索具有3种不同参数类型的表,并相应地对输出进行排名。(下面是我的代码示例)

  1. 关键搜索条件(必须且加权为1) || testvalue = Accountant
  2. 其他必备(加权.8) || testvalue = Manager
  3. 很高兴(加权.5) || testvalue = Excel

SQL:

 SELECT KTBL.Rank as [Ranking], KeySkills
   FROM Applicants INNER JOIN 
      CONTAINSTABLE(Applicants, KeySkills, 
        '(ISABOUT("Accountant" weight(1))) & 
         (ISABOUT("Manager" weight(.8))) | 
         (ISABOUT("Excel") weight(.5)))
     AS KTBL
   ON Applicants.Id = KTBL.[KEY];

上面的语句不返回任何内容,我怀疑它是否有可能以上述方式堆叠术语。

返回的结果必须同时拥有会计和经理,并且很高兴拥有Excel

有什么建议可以实现这一目标吗?


问题答案:

我最终想出了一个对自己的问题的解决方案,我暂时对此感到满意。

我结束了存储过程,如下所示(有点冗长),它需要3个参数1.主搜索键(必须匹配)2.附加的必须用逗号分隔字符串(必须匹配)3.附加的要用逗号分隔细绳

CREATE PROCEDURE [dbo].[GetJobSeekers]
(
@KeywordSearch nvarchar(500),
@MustHave nvarchar(500), --Comma separated skills
@NiceToHave nvarchar(500) --Comma separated skills
)
AS
BEGIN

SET NOCOUNT ON;

DECLARE @SQL nvarchar(4000)
DECLARE @SELECT nvarchar(4000)
DECLARE @SEARCH nvarchar(4000)
DECLARE @SEARCH1 nvarchar(4000)
DECLARE @SEARCH2 nvarchar(4000)
DECLARE @WHERE nvarchar(4000)
DECLARE @ORDERBY nvarchar(4000)

/*Used for string split*/
DECLARE @POS int
DECLARE @NEXTPOS int

/*Get Result for primary search key*/
SET @SELECT =   'SELECT ktbl.rank AS [Ranking], jobseekers.*'
SET @SEARCH =   'ISABOUT("'+@KeywordSearch+'" weight(1))'

SET @WHERE  =   ' FROM jobseekers INNER JOIN
                CONTAINSTABLE (jobseekers, *, ''' + @SEARCH + ''')
                AS ktbl On jobseekers.Id = ktbl.[KEY]'

SET @ORDERBY=   'ORDER BY [Ranking] DESC'

/* Get Result set for all additional must have keywords and INNER JOIN With primary Search */
IF @MustHave <> ''

BEGIN
    DECLARE @MustHaveSplitString nvarchar(500)

    SET @POS = 1
    WHILE(@POS <= LEN(@MustHave))
    BEGIN
        SELECT @NEXTPOS = CHARINDEX(N',', @MustHave,  @POS)
        IF (@NEXTPOS = 0 OR @NEXTPOS IS NULL)
              SELECT @NEXTPOS = LEN(@MustHave) + 1
        SELECT @MustHaveSplitString = RTRIM(LTRIM(SUBSTRING(@MustHave, @POS, @NEXTPOS - @POS)))

        SET @SELECT = @SELECT + ', ktbl'+@MustHaveSplitString+'.rank AS [Ranking'+@MustHaveSplitString+']'
        SET @ORDERBY = @ORDERBY + ', [Ranking'+@MustHaveSplitString+'] DESC'
        SET @SEARCH1 = 'ISABOUT("'+@MustHaveSplitString+'" weight(.8))'
        SET @WHERE = @WHERE + ' INNER JOIN CONTAINSTABLE (jobseekers, *, ''' + @SEARCH1 + ''')
                                AS ktbl'+@MustHaveSplitString+' on Jobseekers.Id = ktbl'+@MustHaveSplitString+'.[KEY]'
        SELECT @POS = @NEXTPOS+1    
    END 
END


/*Get result set for all nice to have by stacking them in the isabout searchcondition and LEFT OUTER JOIN with Primary Search + Must have search if its there*/
IF @NiceToHave <> ''
BEGIN
    DECLARE @NiceToHaveSplitString nvarchar(500)        
    SET @SEARCH2 = 'ISABOUT('

    SET @POS = 1
    WHILE(@POS <= LEN(@NiceToHave))
    BEGIN
        SELECT @NEXTPOS = CHARINDEX(N',', @NiceToHave,  @POS)
        IF (@NEXTPOS = 0 OR @NEXTPOS IS NULL)
              SELECT @NEXTPOS = LEN(@NiceToHave) + 1
        SELECT @NiceToHaveSplitString = RTRIM(LTRIM(SUBSTRING(@NiceToHave, @POS, @NEXTPOS - @POS)))

        SET @SEARCH2 = @SEARCH2 + '"'+@NiceToHaveSplitString+'" weight(.5),'

        SELECT @POS = @NEXTPOS+1    
    END         
    /*Clean last , off the search2 string */
    SET @SEARCH2 = LEFT(@SEARCH2, LEN(@SEARCH2) -1)
    /*Close the isabout in search2 string*/
    SET @SEARCH2 = @SEARCH2 + ')'


    SET @SELECT = @SELECT + ', ktbl2.rank AS [Ranking2]'
    SET @ORDERBY = @ORDERBY + ', [Ranking2] DESC'

    SET @WHERE = @WHERE + ' LEFT JOIN CONTAINSTABLE (jobseekers, *, ''' + @SEARCH2 + ''')
                            AS ktbl2 on Jobseekers.Id =          ktbl2.[KEY]'
END

SET @SQL    =   @SELECT + @WHERE + @ORDERBY

EXEC sp_executesql @SQL
END

存储过程仍未100%完成,因为它需要考虑其他逻辑,但是暂时将充当最终结果的外壳。另外,我还没有针对任何大量数据进行测试,因此我仍然不确定它的性能如何。

亲切的问候,



 类似资料:
  • 我实现了一个二进制搜索树,并为它编写了一个测试类(在JUNIT测试中)。除了一次考试,所有的考试都通过了。当我调试代码时,测试leavesIsTrue tWhenTreeIs完美()会得到一条消息。 预期: 请记住,所有其他测试都会通过,我不认为这是树代码的问题。 你如何理解测试的描述? 测试等级:

  • 问题内容: 我将Hibernate 3与SQL Server 2008一起使用。我想在Hibernate Criteria中进行区分大小写的搜索。我无法实现。我的代码如下: 我有一个类 User.java ,其中包含一个。 数据库条目: 现在,如果我按第2行传递,则它应该从db返回第一条记录。但是,如果我通过,,等如在第2行,没有记录将被取回。 我已经访问了此链接,但对我没有帮助,因为我不想将排序

  • 问题内容: 我有一个用于Elasticsearch的简单JSON查询,如下所示: 仅当值(在这种情况下为“ a1”)不为空时,才如何执行第二个“必须”条件? 问题答案: 您可以使用以下方法实现它-

  • 我正在使用Nest连接到ElasticSearch并执行一些查询。到目前为止,在给定一个通配符查询的情况下,我能够得到我想要的结果,如下所示: 但是现在我需要为某个用例的查询添加附加条件。 我需要的不仅是通过查询,还需要其他两个匹配的字段: 搜索术语"*" field 1="一些字符串" field="一些指南" 我确信在弹性搜索中一定有办法做到这一点(使用Nest),但我还没有找到它。 我知道我

  • 问题内容: 我在Ionic App中显示了带有pdf.js的pdf文件。我不使用viewer.js和viewer.html,因为我需要完全不同的布局。现在,我有一个自定义搜索栏,我想突出显示pdf文件中的术语。我可以调用一个函数来执行此操作吗? 我正在像这样渲染文件: HTML: 问题答案: 现在我找到了解决方案! 搜索字词: 而且我必须导入viewer.js。 我在问题中发布的代码不再需要。PD