【问题标题】:Procedure to Search String with split使用拆分搜索字符串的过程
【发布时间】:2015-11-13 09:47:40
【问题描述】:

我需要使用 OR 条件在多个列中搜索字符串,并且还想按空格分割字符串。前任。如果用户搜索“软件开发人员”,那么一个简单的查询就像

Select * from TableName Where Col1 LIKE '%Software%' OR Col2 LIKE '%Software%' OR Col3 LIKE '%Software%' OR Col1 LIKE '%Developer%' OR Col2 LIKE '%Developer%' OR Col3 LIKE '%Developer%'

In Procedure 应该是一个参数。像

ProcedureName 'Software Developer'

我可以处理上述查询,但我需要知道,有没有我可以做的简单、快速和更好的查询。

【问题讨论】:

  • 根据你的问题,你真正需要的是FTS
  • 我想我不能在 GoDaddy 共享主机数据库中使用 FTS。 !!

标签: sql sql-server string stored-procedures split


【解决方案1】:

你瘦了可以用这样的查询

Select * from Table where (col1 + col2 + col3 like '%Software%') OR (col1 + col2 + col3 like '%Engineer%')

【讨论】:

  • 我正在对与应用程序相关的检索之一使用相同的查询,并且工作正常。你能告诉我你生成的 SQL 吗?
  • 如果该列只有Software 而没有Developer,您的解决方案将不起作用
  • @ughai 发送搜索文本时,请确保使用正确的前缀和后缀以及空格替换。我目前正在为我们的员工表这样做,其中有 20 多名员工,他们的名字和姓氏相同,但中间名不同,
  • 根据 OP 的要求剥离搜索字符串并独立搜索它们,您的解决方案只有在所有列中都存在整个字符串的部分时才有效。相反,OP想要的是即使搜索字符串中的单个单词匹配,也返回该行。这与您想要针对第一个姓氏和中间名搜索单词“Kumar”以查看它是否出现在任何这些列中时不同
  • 但在我的情况下,它不确定两个单词是否会在同一行。可能会也可能不会
【解决方案2】:
SELECT     dbo.JD_tblJob.EmployerID, dbo.JD_tblJob.PostDate, dbo.JD_tblJob.JobID, dbo.JD_tblJob.JobTitle, dbo.JD_tblJob.JobDescr, dbo.JD_tblJob.MinWorkExp, 
                  dbo.JD_tblJob.MaxWorkExp, dbo.JD_tblJob.MinSalary, dbo.JD_tblJob.MaxSalary, dbo.JD_tblJob.HideSalary, dbo.JD_tblJob.NoOfVacancies, 
                  dbo.JD_tblJob.JobLocation, dbo.JD_tblJob.Active, dbo.JD_tblEmployer.CompanyName, tblKeySkill.fldName AS KeySkillName, 
                  tblFuncArea.fldName AS FuncAreaName FROM dbo.JD_tblJob INNER JOIN dbo.JD_tblMaster AS tblFuncArea ON dbo.JD_tblJob.FuncAreaID = tblFuncArea.ID INNER JOIN dbo.JD_tblMaster AS tblKeySkill ON dbo.JD_tblJob.KeySkillID = tblKeySkill.ID INNER JOIN dbo.JD_tblEmployer ON dbo.JD_tblJob.EmployerID = dbo.JD_tblEmployer.ID WHERE (dbo.JD_tblJob.JobTitle LIKE '%Engineer%') OR (tblKeySkill.fldName LIKE '%Engineer%') OR (tblFuncArea.fldName LIKE '%Engineer%') OR (dbo.JD_tblJob.JobTitle LIKE '%Software%') OR (tblKeySkill.fldName LIKE '%Software%') OR (tblFuncArea.fldName LIKE '%Software%')

它给了我结果,但下面没有显示任何行

SELECT     dbo.JD_tblJob.EmployerID, dbo.JD_tblJob.PostDate, dbo.JD_tblJob.JobID, dbo.JD_tblJob.JobTitle, dbo.JD_tblJob.JobDescr, dbo.JD_tblJob.MinWorkExp, dbo.JD_tblJob.MaxWorkExp, dbo.JD_tblJob.MinSalary, dbo.JD_tblJob.MaxSalary, dbo.JD_tblJob.HideSalary, dbo.JD_tblJob.NoOfVacancies, dbo.JD_tblJob.JobLocation, dbo.JD_tblJob.Active, dbo.JD_tblEmployer.CompanyName, tblKeySkill.fldName AS KeySkillName, tblFuncArea.fldName AS FuncAreaName FROM dbo.JD_tblJob INNER JOIN dbo.JD_tblMaster AS tblFuncArea ON dbo.JD_tblJob.FuncAreaID = tblFuncArea.ID INNER JOIN dbo.JD_tblMaster AS tblKeySkill ON dbo.JD_tblJob.KeySkillID = tblKeySkill.ID INNER JOIN dbo.JD_tblEmployer ON dbo.JD_tblJob.EmployerID = dbo.JD_tblEmployer.ID WHERE dbo.JD_tblJob.JobTitle + tblKeySkill.fldName + tblFuncArea.fldName LIKE '%Engineer%Software%')

【讨论】:

    【解决方案3】:
    --What you are searching for
    DECLARE @yourSearch varchar(50) = 'Software Developer'
    
    DECLARE @strs varchar(200)
    SET @strs = REPLACE(@yourSearch,' ','.')
    DECLARE @searchWord1 varchar(50);
    DECLARE @searchWord2 varchar(50);
    
    --Split search into 2 words
    SELECT
      @searchWord1 = PARSENAME(@strs,1),
      @searchWord2 = PARSENAME(@strs,2)
    
    --Do the select
    SELECT * FROM TableName 
    WHERE 
      CONCAT(COALESCE( Col1, ''),COALESCE( Col2, ''),COALESCE( Col3, '')) LIKE '%' + @searchWord1 +  '%'
      OR 
      CONCAT(COALESCE( Col1, ''),COALESCE( Col2, ''),COALESCE( Col3, '')) LIKE '%' + @searchWord2 +  '%'
    

    【讨论】:

      猜你喜欢
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-13
      • 1970-01-01
      • 2020-05-30
      相关资源
      最近更新 更多