部分字符串匹配mysql

Posted

技术标签:

【中文标题】部分字符串匹配mysql【英文标题】:Partial string matching mysql 【发布时间】:2017-07-02 14:45:01 【问题描述】:

我正在处理客户的银行交易数据,并希望排除包含部分或全部客户姓名的交易。 我的数据如下所示:

Table A:
Cust_ID       |TxnDescription                       |
-----------   |-------------------------------------|
C123-------   |#######LIANDRI CORPORATION###########|
C123-------   |#########LIANDRI#####################|
C123-------   |############JEFF L###################|
C123-------   |#########K.S. LI ANDRI###############|
C123-------   |############XAN KRIEGOR##############|
C123-------   |####AXON RESEARCH CORPORATION########|
C123-------   |############FENTECH INCORPORATED#####|
C123-------   |########PHAYDER CORPORATION##########|
C123-------   |############IZANAGI CORPORATION######|

Table B:
Cust_ID       |PromoterName                         |
--------------|-------------------------------------|
C123          |LIANDRI CORPORATION                  |
C123          |JEFF LIANDRI                         |
C123          |K S LIANDRI                          |
C123          |XAN KRIEGOR                          |
C324          |IZANAGI CORPORATION                  |

我想要的输出是:

TABLE: E
Cust_ID       |TxnDescription                       |Fl_Exclude  |
-----------   |-------------------------------------|------------|
C123-------   |#######LIANDRI CORPORATION###########|YES         |
C123-------   |#########LIANDRI#####################|YES         |
C123-------   |############JEFF LI ANDRI############|YES         |
C123-------   |#########K.S. LI ANDRI###############|YES         |
C123-------   |############XAN KRIEGOR##############|YES         |
C123-------   |####AXON RESEARCH CORPORATION########|NO          |
C123-------   |############FENTECH INCORPORATED#####|NO          |
C123-------   |########PHAYDER CORPORATION##########|NO          |
C123-------   |############IZANAGI CORPORATION######|NO          |

我这里的做法是将表 B 中的发起人名称分解为单词,如下所示:

TABLE: C
Cust_ID       |PromoterNamePart                     |
--------------|-------------------------------------|
C123          |LIANDRI                              |
C123          |CORPORATION                          |
C123          |JEFF                                 |
C123          |LIANDRI                              |
C123          |K S                                  |
C123          |LIANDRI                              |
C123          |XAN                                  |
C123          |KRIEGOR                              |

然后删除重复项以消除歧义

TABLE: D
Cust_ID       |PromoterNamePart                     |
--------------|-------------------------------------|
C123          |LIANDRI                              |
C123          |JEFF                                 |
C123          |K S                                  |
C123          |XAN                                  |
C123          |KRIEGOR                              |

Cust_ID 上加入 AD 以及使用 D.PromoterNamePartlike 子句时/strong> 在 A.TxnDescription 上,我期待得到我的输出。

现在,我被困在将表 B 拆分为 C,因为单个字母的连续缩写将被视为一个单词。

对于如何解决此问题或任何替代解决方案的任何想法将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

为了在 c 中破坏表 b,你需要一些东西来分割..这在本地 mysql 函数中不存在..但是你可以用两种方式(至少)构建你的(分割)函数

    使用存储过程 服务器端 .. 从 b 中选择并使用拆分或分解功能正确填充 C(取决于您的服务器端环境)

然后一旦你有表 C

你可以像这样使用

select distinct 
    a.Cust_id
  , a.PromoterNamePart
  , case when a.PromoterNamePart like concat('%',d.PromoterNamePart, '%') 
                  Then 'YES'
                   ELSE 'NO' 
          END as Fl_Exclude
from tableA as a
left join tableD as d

【讨论】:

以上是关于部分字符串匹配mysql的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL初级学习笔记七:MySQL中使用正则表达式!(视频序号:初级_44)

用于支持加密数据库字段上的部分字符串匹配的安全方法

MySQL 复杂字符串匹配

支持加密数据库字段的部分字符串匹配的安全方法

mysql如何正则匹配查询

MySQL 查找子字符串匹配并按匹配全字分组