You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

基于另一表文本字段值关联筛选House与Room表数据的SQL方案

解决方案:匹配house.nb与room.body中的完整数字串

嘿,我来帮你搞定这个关联匹配的需求!核心是要找出house表中nb字段的值完整出现在roombody文本中的关联数据,得注意不能误匹配到更长数字的一部分(比如不能把222和包含222222的记录关联)。

下面分不同数据库给出具体实现方案:

MySQL 实现

利用MySQL的正则表达式单词边界匹配,确保匹配的是独立完整的数字串:

SELECT h.*, r.*
FROM house h
JOIN room r 
  ON r.body REGEXP CONCAT('[[:<:]]', h.nb, '[[:>:]]');
  • [[:<:]][[:>:]] 是MySQL的单词边界标记,能避免把222匹配到222222这类更长数字里。
  • 用你的示例数据测试,会返回两组结果:house(id=1, nb=111)关联room(id=1)house(id=2, nb=222)关联room(id=4),完全符合预期。

PostgreSQL 实现

PostgreSQL用\m(单词开头)和\M(单词结尾)来做边界匹配:

SELECT h.*, r.*
FROM house h
JOIN room r 
  ON r.body ~* ('\m' || h.nb || '\M');
  • ~* 表示不区分大小写的正则匹配,要是需要严格区分大小写,换成~就行。

SQL Server 实现

SQL Server可以用PATINDEX结合前后非数字的判断,同时给文本前后补空格处理边界场景:

SELECT h.*, r.*
FROM house h
JOIN room r 
  ON PATINDEX('%[^0-9]' + CAST(h.nb AS VARCHAR(20)) + '[^0-9]%', ' ' + r.body + ' ') > 0;
  • body前后加空格,是为了处理nb出现在文本开头或结尾的情况,确保前后都有非数字字符(空格)来匹配正则规则。

避坑提醒

如果直接用LIKE CONCAT('%', h.nb, '%'),会错误匹配到包含该数字的更长字符串(比如222会匹配到222222),所以一定要用边界匹配来保证结果的准确性。

内容的提问来源于stack exchange,提问作者caramba

火山引擎 最新活动