这是完成的查询;解释如下:
SELECT
Body,
SUM(
CASE WHEN Value IS NULL THEN 0
ELSE (LENGTH(Body) - LENGTH(REPLACE(Body, Value, ''))) / LENGTH(Value)
END
) AS Val
FROM (
SELECT TableA.Body, TableB.Value
FROM TableA
LEFT JOIN TableB ON INSTR(TableA.Body, TableB.Value) > 0
) CharMatch
GROUP BY Body
这里有一个 SQL Fiddle 。
现在解释...
内部查询将TableA
字符串与TableB
子字符串匹配:
SELECT TableA.Body, TableB.Value
FROM TableA
LEFT JOIN TableB ON INSTR(TableA.Body, TableB.Value) > 0
其结果是:
BODY VALUE
-------------------- -----
ABABCDEF AB
ABABCDEF CD
IJKLMNOP
QRSTUVWKYZ QR
如果你只计算这些,你只会得到字符串的2值,因为它只是寻找ABABCDEF
子字符串的存在并且没有考虑AB
两次出现的情况。
MySQL 似乎没有OCCURS
类型函数,因此为了计算出现次数,我使用了将字符串长度与其长度进行比较的解决方法,目标字符串已删除,除以目标字符串的长度。这是一个解释:
REPLACE('ABABCDEF', 'AB', '') ==> 'CDEF'
LENGTH('ABABCDEF')
==> 8
LENGTH('CDEF')
==> 4
因此,删除所有匹配项的字符串长度AB
为 8 - 4 或 4。将 4 除以 2 ( LENGTH('AB')
) 得到AB
出现次数:2
字符串IJKLMNOP
会搞砸的。它没有任何目标值,因此除以零风险。内部CASE
可以SUM
防止这种情况。