這是完成的查詢;解釋如下:
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小提琴here。
現在的解釋...
內查詢匹配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
如果你只是算上這些,你」對於ABABCDEF
字符串只會得到的值,因爲它看起來只是f或子字符串的存在,並沒有考慮到AB
發生兩次。
MySQL似乎沒有OCCURS
類型的函數,因此爲了計算出現的次數,我使用了將字符串長度與其長度相除的解決方法,並將目標字符串刪除,除以目標字符串的長度。下面是一個說明:
REPLACE('ABABCDEF', 'AB', '') ==> 'CDEF'
LENGTH('ABABCDEF')
==> 8
LENGTH('CDEF')
==> 4
因此,所有AB
出現除去串的長度是8 - 4,或4.將4除以2(LENGTH('AB')
)以得到AB
發生次數:2
字符串IJKLMNOP
會搞砸了。它沒有任何目標值,所以有零風險的分割。 SUM
內部的CASE
可以防止這種情況發生。
通過使用比MySQL –
以外的語言寫一個函數。不能用純SQL解決。試一試,遇到問題時再回來。 – fancyPants
會做,謝謝。 – user1029296