0

我想根据两个字符串中匹配单词的数量对结果进行排序(不区分大小写)。有没有办法给两个字符串来计算两个字符串中出现的匹配单词的数量?

例子:

"Red blue black green", "Green Black Blue"
-> 3
"Blue Green", "green blue"
-> 2
"Blue Green", "Red blue"
-> 1
"green blue black", "orange purple"
-> 0

我想在 Order By 子句中使用它。假设一个表中有一个包含字符串的列,我将查询该表,然后根据传入的字符串中具有最匹配单词的行对结果进行排序。

4

1 回答 1

1

您可以使用 将两个短语拆分为单词regexp_split_to_table(),然后计算匹配项。横向连接对此很方便。

select t.*, x.cnt_matches
from (values 
    ('Red blue black green', 'Green Black Blue'),
    ('Blue Green',           'green blue'),
    ('Blue Green',           'red blue'),
    ('green blue black',     'orange purple')
) as t(str1, str2)
cross join lateral (
    select count(*) cnt_matches
    from regexp_split_to_table(lower(t.str1), ' ') w1(word)
    inner join regexp_split_to_table(lower(t.str2), ' ') w2(word)
        on w1.word = w2.word
) x

DB Fiddle 上的演示

str1 | str2 | cnt_matches
:-------------------- | :--------------- | ----------:
红蓝黑绿| 绿色 黑色 蓝色 | 3
蓝绿 | 绿蓝| 2
蓝绿 | 红蓝| 1
绿蓝黑| 橙紫| 0
于 2020-11-02T10:51:54.460 回答