2013-05-21 28 views
4

我有兩個表「A」和「B」。表「A」有兩列「身體」和「數字」。 「Number」列是空的,目的是填充它。用另一列中的子串數填充列

表A:身體/數

ABABCDEF/
IJKLMNOP/
QRSTUVWKYZ/

表 「B」 只有一個列:

表B:價值

AB 
CD 
QR 

這裏就是我要找的結果:

ABABCDEF/3 
IJKLMNOP/0 
QRSTUVWKYZ/1 

換句話說,我想創建一個查詢,查找「Body」列中的每個字符串,「Values」列中的子字符串顯示的次數。

你會如何建議我這樣做?

+0

通過使用比MySQL –

+1

以外的語言寫一個函數。不能用純SQL解決。試一試,遇到問題時再回來。 – fancyPants

+0

會做,謝謝。 – user1029296

回答

2

這是完成的查詢;解釋如下:

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可以防止這種情況發生。

0

你想要一個update查詢:

update A 
    set cnt = (select sum((length(a.body) - length(replace(a.body, b.value, ''))/length(b.value)) 
       from b 
      ) 

它使用一個小竅門對於一個給定的字符串中的計數b.value發生的數量。它用空字符串替換每個事件並計算字符串長度的差異。這除以被替換的字符串的長度。

如果你只是想(所以第一個值是「2」,而不是「3」)匹配的數目:

update A 
    set cnt = (select count(*) 
       from b 
       where a.body like concat('%', b.value, '%') 
      ) 
相關問題