小编典典

查询以返回特定值在字符串中出现的次数?

sql

好,所以我有两个桌子。表1具有参考数字列(A),第二列具有随机字符串(B)。表2只有一列,其中列出了可能在表1的字符串中也可能不在字符串中的值。

dbo.Tbl_1

+--+---------------------------------------+
|A |B                                      |
+--+---------------------------------------+
|24|BLUE; KITTEN; WHITE; PINK; SLOPE; GREEN|
+--+---------------------------------------+
|51|GREEN; CLOUDY; WHITE; CHIPS            |
+--+---------------------------------------+
|78|PATRIOTS; PINK; PINK; WHITE            |
+--+---------------------------------------+
|22|WHITE; RED; TREES; AMY; GREEN          |
+--+---------------------------------------+

dbo.Tbl_2

+-----+
|C    |
+-----+
|BLUE |
+-----+
|WHITE|
+-----+
|PINK |
+-----+
|BROWN|
+-----+

哪种SQL查询将确定在Table1的字符串中找到Table2的值的次数是多少?基本上我想返回以下结果集:

+-----+----+
|BLUE |1   |
+-----+----+
|WHITE|4   |
+-----+----+
|PINK |3   |
+-----+----+
|BROWN|NULL|
+-----+----+

仅供参考:实际上,表2具有大约200条唯一记录。表1记录了约160万条记录,并带有唯一的参考号。这两个表都不是静态的。


阅读 190

收藏
2021-04-14

共1个答案

小编典典

我玩了一下,想出了这个SQL提琴

相关的SELECT查询看起来像这样(尽管需要两次表扫描,但我确信它可以变得更有效率):

select C, sum(dbo.CountOccurancesOfString(B, C)) as number
from Tbl_1 join Tbl_2 on 1=1
group by C
order by number desc

编辑 这是我从这个答案得到的功能:

CREATE FUNCTION dbo.CountOccurancesOfString
(
 @searchString nvarchar(max),
 @searchTerm nvarchar(max)
)
RETURNS INT
AS
BEGIN
 return (LEN(@searchString)-LEN(REPLACE(@searchString,@searchTerm,'')))/LEN(@searchTerm)
END
2021-04-14