【问题标题】:MySQL How to use REGEXP to Filter one column's rows by another column's rowsMySQL 如何使用 REGEXP 通过另一列的行过滤一列的行
【发布时间】:2018-03-17 23:41:20
【问题描述】:
  1. 一个表 t1 有一个 partnercode 列,(从 t1 中选择合作伙伴代码)返回 1859 个 varchar 行。

  2. 在另一个具有username varchar 列(与 t1 没有键关系)的表 t2 上,我需要编写一个查询来删除 t2.username 以 t1 中的任何字符串值开头的所有行。合作伙伴代码。

我试图通过查询来做到这一点:

SELECT t2.username FROM t2 where t2.username NOT REGEXP(CONCAT_WS("|^", SELECT partnercode from t1)) 

得到错误代码:1242。子查询返回多于 1 行。

我知道如果我将单个字符串提供给 REGEXP() 函数并在它们前面加上 ^,这将删除正确的值。但在我有 1859 行这些值的情况下,我不确定正确的方法。

来自 t1.partnercode 的记录
1031
1032
121CM
第1234章

来自 t2.username 的记录
1031-PNGUQG
1032-X2NOAN121
121CM-VBFWAA13b
1234-SETJ6b5

在上面的示例数据中,来自 t2.username 的所有记录都应从查询中过滤掉。

【问题讨论】:

  • 它奇怪的数据库模式...
  • 它们来自不同的数据库。一个用于在公司不再使用的遗留系统中填充另一个。
  • 从每个表中粘贴几条记录。如果人们能看到一些有代表性的数据,他们就能更有效地帮助你。请务必注明哪些记录是t1,哪些是t2
  • 这太低效了。认真考虑规范化您的架构

标签: mysql regex


【解决方案1】:

怎么样

  SELECT t2.username 
    FROM t2 
    where not exists (select null 
                        from t1 
                        where t2.username REGEXP CONCAT("^", t1.partnercode)

使用存在使条件一次只考虑一行。

【讨论】:

  • 宾果游戏!做到了。我将记录下不存在/存在迫使条件一次考虑一行。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2021-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多