【问题标题】:Populate column with number of substrings in another column用另一列中的子字符串数填充列
【发布时间】:2013-05-21 23:20:54
【问题描述】:

我有两个表“A”和“B”。表“A”有两列“Body”和“Number”。 “数字”列是空的,目的是填充它。

表 A:正文/编号

ABABCDEF /
IJKLMNOP /
QRSTUVWKYZ /

表“B”只有一列:

表 B:值

AB
CD
QR

这是我正在寻找的结果:

ABABCDEF / 3
IJKLMNOP / 0
QRSTUVWKYZ / 1

换句话说,我想创建一个查询,查找“Body”列中的每个字符串,“Values”列中的子字符串出现了多少次。

你会建议我怎么做?

【问题讨论】:

  • 使用 MySQL 以外的语言
  • 写一个函数。无法用纯 SQL 解决。试试看,遇到问题再回来。
  • 我不是程序员,但我会说这不是一个坏主意。
  • 你可以找出其中一个值是否在body中,但我不知道如何找出它是多少次

标签: mysql


【解决方案1】:

这是完成的查询;解释如下:

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 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 字符串的 2 值,因为它只是查找子字符串的存在,而没有考虑到 @987654328 @ 出现两次。

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 可以防止这种情况发生。

【讨论】:

    【解决方案2】:

    你想要一个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, '%')
                  )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-27
      • 2021-07-27
      • 2021-10-21
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      相关资源
      最近更新 更多