【问题标题】:Select where any word in string of column A matches any word in string of column B选择 A 列字符串中的任何单词与 B 列字符串中的任何单词匹配的位置
【发布时间】:2020-04-21 09:07:01
【问题描述】:

我一直在搜索该网站以获取一些指导,但我无法找到适合的内容。我想知道是否有一种方法可以选择“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_of_kin 中的任何单词与Name 中的任何单词匹配的行。我希望达到的结果是:

ID | Name              | Name_of_kin 
1  | Peter Reeves      | John Reeves
3  | Rico van Der      | Moses van Fel

非常感谢您!

【问题讨论】:

    标签: sql string postgresql where-clause


    【解决方案1】:

    您可以将每个字符串转换为一系列单词并检查它们是否重叠:

    select t.*
    from mytable t
    where string_to_array(t.name, ' ') && string_to_array(t.name_of_kin, ' ')
    

    Demo on DB Fiddle

    编号 |姓名 | name_of_kin -: | :----------- | :------------ 1 |彼得·里夫斯 |约翰·里夫斯 3 |里科范德 |摩西·范菲尔

    在 Snowflake 中,您可以这样写:

    select t.*
    from mytable t
    where array_overlap(split(t.name, ' '), split(t.name_of_kin, ' '))
    

    【讨论】:

    • @TimBiegeleisen:谢谢!如果那不是 Postgres,那将真的更复杂......
    • 感谢您的快速回复!这确实是又短又甜!不过我有一个问题,有没有一种方法可以在不使用 && 运算符的情况下做到这一点?我的数据是通过雪花连接的,不支持&&。我尝试使用 intersect 但它似乎也不起作用。
    • 您可以选择提交原始查询吗?
    • @Jeremy: snowflake 有不同的语法,但split()array_overlap() 似乎具有相同的功能。我更新了我的答案。
    • 非常感谢!我仍在尝试查看文档以获取并行语法,但您很快就完成了。非常感谢
    【解决方案2】:

    你可以用正则表达式做到这一点:

    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, ' ', '|');
    

    Here 是一个 dbfiddle。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多