SELECT
ccp.ProductID, p.ProductDescription, descrlen=LEN(p.ProductDescription),
bulletcnt=0, indx=0, lastmatchat=0
INTO #DescrBullets
FROM Private.CompositeCatalogProduct AS ccp WITH(NOLOCK)
INNER JOIN Products.Product AS p WITH(NOLOCK) ON p.ProductId = ccp.ProductID
WHERE ccp.CompositeCatalogID=53
DECLARE @rows INT = 1
WHILE @rows>0
BEGIN
-- find the next occurrence on each row that's still in play
UPDATE #DescrBullets
SET lastmatchat = PATINDEX('% - %',RIGHT(ProductDescription,descrlen-indx))
WHERE indx<descrlen
-- anywhere that a match was found, increment my counter, and move my
-- index "cursor" past it
UPDATE #DescrBullets
SET bulletcnt = bulletcnt + 1,
indx = indx + lastmatchat + 2
WHERE lastmatchat>0
SET @rows = @@ROWCOUNT
-- for all the ones that didn't have a match, advance indx past the end
-- so we don't need to reprocess on next iterations
UPDATE #DescrBullets
SET indx=descrlen
WHERE lastmatchat=0
RAISERROR('processing, %d products still have bullets', 0, 1, @rows) WITH NOWAIT
END
SELECT db.bulletcnt, occurs=COUNT(*)
FROM #DescrBullets AS db
GROUP BY db.bulletcnt
ORDER BY 1
4条答案
按热度按时间n3schb8v1#
一个明显但不可扩展的方法是这样的
字符串
你研究过MySQL中的全文搜索吗?
8iwquhpp2#
如果你想计算一个字符串在一个列中出现的次数,你可以使用
IF
。字符串
iqxoj9l93#
我只需要做一些类似的事情,但采取了不同的方法,我将相关的字符串复制到一个临时表中,在那里我可以添加列来跟踪每一行的索引。
在我的例子中,我在产品描述中寻找子字符串“-“(空格-破折号-空格),目的是最终将这些子字符串分割成项目符号,然后分析数据,看看产品通常有多少个“项目符号”。
我怀疑这比重复重写字符串值更有效,但我还没有真正进行基准测试。
字符串
kulphzqa4#
我想你也许可以用下面的例子。我是想数的次数,一个特定的纸箱类型被使用时,航运。
字符串
您的场景:
型
如果取出“where”函数,它将计算每个不同条目在“my_column”中出现的次数。