Mysql 用另一列中的子字符串数填充列
我有两张A桌和B桌。表“A”有两列“正文”和“编号”。列“编号”为空,目的是填充它 表A:主体/数量Mysql 用另一列中的子字符串数填充列,mysql,Mysql,我有两张A桌和B桌。表“A”有两列“正文”和“编号”。列“编号”为空,目的是填充它 表A:主体/数量 ABABCDEF / IJKLMNOP / QRSTUVWKYZ / 表“B”只有一列: 表B:价值 AB CD QR 以下是我所寻找的结果: ABABCDEF / 3 IJKLMNOP / 0 QRSTUVWKYZ / 1 换句话说,我想创建一个查询,为“Body”列中的每个字符串查找“Values”列中的子字符串出现的次数 你建议我怎么做?这是完成的查询;解释如下: SELECT
ABABCDEF /
IJKLMNOP /
QRSTUVWKYZ /
表“B”只有一列:
表B:价值
AB
CD
QR
以下是我所寻找的结果:
ABABCDEF / 3
IJKLMNOP / 0
QRSTUVWKYZ / 1
换句话说,我想创建一个查询,为“Body”列中的每个字符串查找“Values”列中的子字符串出现的次数
你建议我怎么做?这是完成的查询;解释如下:
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小提琴
现在来解释一下
内部查询将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
字符串的值将仅为2,因为它只查找子字符串的存在,而没有考虑到AB
出现两次
MySQL似乎没有OCCURS
type函数,因此为了计算出现的次数,我使用了一种变通方法,将字符串的长度与其删除的目标字符串的长度进行比较,除以目标字符串的长度。这里有一个解释:
REPLACE('ABABCDEF','AB','')==>CDEF'
==>8LENGTH('ABABCDEF')
==>4LENGTH('CDEF')
AB
引用的字符串长度为8-4,或4。将4除以2(LENGTH('AB')
)得到AB
出现次数:2
字符串
IJKLMNOP
会把事情搞砸。它没有任何目标值,因此存在除以零的风险。SUM
中的案例
可防止出现这种情况。您需要更新
查询:
update A
set cnt = (select sum((length(a.body) - length(replace(a.body, b.value, '')) / length(b.value))
from b
)
这使用了一个小技巧来计算给定字符串中b.value
的出现次数。它用空字符串替换每个匹配项,并计算字符串长度的差异。这除以被替换字符串的长度
如果您只是想要匹配的数量(因此第一个值应该是“2”而不是“3”):
通过使用MySQL以外的语言编写函数。不能用纯SQL解决。试一试,遇到问题时再来。我不是程序员,但我想说这不是一个坏主意。你可以找出身体中是否有一个有价值的东西,但我不知道如何找出它有多少次
update A
set cnt = (select count(*)
from b
where a.body like concat('%', b.value, '%')
)