我有一些这样的数据:
变音器 | 落后 |
---|---|
FLKSW | [无效的] |
聚苯乙烯 | FLKSW |
聚苯乙烯 | 聚苯乙烯 |
游戏机 | 聚苯乙烯 |
我想在以下条件下比较两列中的字符串值:如果它们共享至少 2 个字符,它们是相似的(分配一些值,比如 1)。否则,它们不相似。
所以在这个例子中,PPS 和 PSP 是相似的。
如何实现这种子字符串比较?
我知道一种方法是提取子字符串并手动比较它们,但感觉很笨拙,我不知道可能出现的最大字符数。
我有一些这样的数据:
变音器 | 落后 |
---|---|
FLKSW | [无效的] |
聚苯乙烯 | FLKSW |
聚苯乙烯 | 聚苯乙烯 |
游戏机 | 聚苯乙烯 |
我想在以下条件下比较两列中的字符串值:如果它们共享至少 2 个字符,它们是相似的(分配一些值,比如 1)。否则,它们不相似。
所以在这个例子中,PPS 和 PSP 是相似的。
如何实现这种子字符串比较?
我知道一种方法是提取子字符串并手动比较它们,但感觉很笨拙,我不知道可能出现的最大字符数。
不幸的是,字符串或数组没有内置的“相交”运算符或函数。您可以滚动自己的函数来计算重叠字符:
INTERSECT ALL
包括重复的匹配字符。要折叠重复项,请使用 justINTERSECT
代替。那么您的查询可以是:
db<>在这里摆弄
但它很昂贵,并且不能很好地扩展表中的更多行 - O(N²)。根据您的实际目标,有各种更好的选择——比如附加模块pg_trgm提供的三元组相似性。看: