在字符串sql中按最大匹配顺序选择结果

时间:2016-08-18 03:39:47

标签: sql sql-server sql-server-2008

我在表tblCountry中有一个字符串列,例如'印度,澳大利亚,美国,英国'。 现在无论提供什么序列,例如美国,德国,英国,印度,俄罗斯'我必须分开 以空格为基础的字符串,然后显示“列国家/地区”值中即使是单个国家/地区的所有结果。 至此,我通过以下查询实现了。现在困难的部分是我必须首先显示结果 具有列值的最大匹配。

例如,如果以下是列值:

'India, Austrailia, US, Italy'
'India, Malaysia, Austrailia, US, UK'
'UK, Austrailia, France, Korea, India'
'China, India, US, UK'
输入字符串是< Austrailia,英国,印度,韩国,德国'那么结果应该是最大匹配,如下所示:   对于上述情况,输出是最匹配的国家/地区的相关性,如下所示

 'UK, Austrailia, France, Korea, India'   
 'India, Malaysia, Austrailia, US, UK'   
 'India, Austrailia, US, Italy'  
 'China, India, US, Brazil'


declare @matchCount int = 0;

SET @matchCount = (SELECT count(Item)  
        FROM dbo.SplitCountry('Austrailia, UK, India, Korea, Germany' , ',') 
        where Countries like '%'+Item+'%')

SELECT Countries, CASE 
WHEN @matchCount >0 THEN @matchCount 
     ELSE 0
  FROM tblCountry

我使用了一个函数来分割字符串' SplitCountry'。我也不能在这里使用全文

2 个答案:

答案 0 :(得分:0)

你必须

  • 创建临时表#t1(CountriesID,Country)
  • 创建临时表#t2(国家/地区)
  • 使用split功能填充#t1,所以你有:

    CountriesID国家/地区

    1印度

    1 Austrailia

    1美国

    1意大利

    2印度

    2马来西亚

    2 Austrailia

    2美国

    2英国

    3 ......等等

  • 使用拆分函数填充#t2,因此t#包含输入值

  • 最后:

SELECT#t1.CountriesID,c.Countries

FROM#t1

INNER JOIN#t2 on#t2.Country =#t1.Country

INNER JOIN tblCountry c ON c.CountriesID =#t1.CountriesID

GROUP BY#t1.ID,c .Countries

按COUNT排序(*)DESC

答案 1 :(得分:0)

最后进行了大量的研究,我为我的问题找到了一个简单的解决方案。以下查询对我来说非常有用

DECLARE @patterns TABLE( pattern VARCHAR(20) );

插入@patterns VALUES('%india%'),('%france%'),('%US%'), ('%UK%&#39)

;使用CTEORD AS ( 选择a。*,ROW_NUMBER()Over(按国家/地区分区,按p.pattern排序)AS RN FROM Countries a 加入@patterns p  ON(a.country LIKE p.pattern) )

选择MAX(RN)作为RN,国家,  来自CTEORD集团的国家  由RN desc命令