Sql 选择A列字符串中的任何单词与B列字符串中的任何单词匹配的位置
我一直在网站上寻找一些指导,但是我没有找到合适的。我想知道是否有一种方法可以选择“a列字符串中的任何单词与B列字符串中的任何单词匹配”的行?我正在使用postgresqlSql 选择A列字符串中的任何单词与B列字符串中的任何单词匹配的位置,sql,string,postgresql,where-clause,Sql,String,Postgresql,Where Clause,我一直在网站上寻找一些指导,但是我没有找到合适的。我想知道是否有一种方法可以选择“a列字符串中的任何单词与B列字符串中的任何单词匹配”的行?我正在使用postgresql ID | Name | Name_of_kin 1 | Peter Reeves | John Reeves 2 | Emily Sanchez | Roger James 3 | Rico van Der | Moses van Fel 4 | Monic
ID | Name | Name_of_kin
1 | Peter Reeves | John Reeves
2 | Emily Sanchez | Roger James
3 | Rico van Der | Moses van Fel
4 | Monic | Monica
5 | Michaelangelo | Michael
在这个场景中,我想选择Name\u of_kin
中的任何单词与Name
中的任何单词匹配的行。我希望达到的结果是:
ID | Name | Name_of_kin
1 | Peter Reeves | John Reeves
3 | Rico van Der | Moses van Fel
提前向你表示衷心的感谢 您可以将每个字符串转换为一组单词,并检查它们是否重叠:
select t.*
from mytable t
where string_to_array(t.name, ' ') && string_to_array(t.name_of_kin, ' ')
:
id | name | name_of_kin
-: | :----------- | :------------
1 | Peter Reeves | John Reeves
3 | Rico van Der | Moses van Fel
可以使用正则表达式执行此操作:
select t.*
from mytable t
where t.name ~ ('(\W|^)' || replace(t.name_of_kin, ' ', '(\W|$)|(\W|^)') || '(\W|$)');
或:
或:
是一把小提琴。@TimBiegeleisen:谢谢!如果这不是博士后,那真的会更复杂…谢谢你的快速回复!这真是又短又甜!但是我有一个问题,有没有一种方法可以不使用&&运算符来实现这一点?我的数据是通过雪花连接的,雪花不支持&&。我尝试使用intersect,但它似乎也不起作用。你有提交原始查询的选项吗?@Jeremy:snowflake有不同的语法,但它似乎在
split()
和array\u overlap()
中有相同的功能。我更新了我的答案。非常感谢!我仍在试图查看文档中的并行语法,但您很快就找到了。非常感谢
select t.*
from mytable t
where t.name ~ ('(\W|^)' || replace(t.name_of_kin, ' ', '(\W|$)|(\W|^)') || '(\W|$)');
select t.*
from mytable t
where ' ' || t.name || ' ' ~ (' ' || replace(t.name_of_kin, ' ', ' | ') || ' ')
select t.*
from mytable t
where t.name ~ replace(t.name_of_kin, ' ', '|') and
t.name_of_kin ~ replace(t.name, ' ', '|');