Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择A列字符串中的任何单词与B列字符串中的任何单词匹配的位置_Sql_String_Postgresql_Where Clause - Fatal编程技术网

Sql 选择A列字符串中的任何单词与B列字符串中的任何单词匹配的位置

Sql 选择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

我一直在网站上寻找一些指导,但是我没有找到合适的。我想知道是否有一种方法可以选择“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             | 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, ' ', '|');