String Postgresql:查找子字符串最匹配的字符串

String Postgresql:查找子字符串最匹配的字符串,string,postgresql,pattern-matching,String,Postgresql,Pattern Matching,如果我有一个表测试,其值如下: id | value ---------------- 1 | ABC 1-2-3 2 | AB 1-2-3-4-5 3 | ABC 1 4 | ABC 1-2 5 | ABC 我尝试的输入字符串是abc1-2-3-4-5,那么最接近的子字符串匹配(如果我可以这样称呼的话)应该是abc1-2-3。第2行不应匹配,因为它没有“ABC”。我只能在输入字符串比实际记录短的情况下搜索字符串,但如果输入字符串比实际记录长,则无法搜索。e、 g select *

如果我有一个表测试,其值如下:

id | value
----------------
1  | ABC 1-2-3
2  | AB 1-2-3-4-5
3  | ABC 1
4  | ABC 1-2
5  | ABC
我尝试的输入字符串是abc1-2-3-4-5,那么最接近的子字符串匹配(如果我可以这样称呼的话)应该是abc1-2-3。第2行不应匹配,因为它没有“ABC”。我只能在输入字符串比实际记录短的情况下搜索字符串,但如果输入字符串比实际记录长,则无法搜索。e、 g

select * from test where value ilike 'ABC 1-2%';
但这也没有给我一个确切的记录,只有那些以ABC 1-2开头的。如何构造适当的sql语句来解决此问题?

您可能会感兴趣:

您的数据的标准相似性如下:

select *, similarity(value, 'ABC 1-2-3-4-5')
from test
order by 3 desc;

 id |    value     | similarity 
----+--------------+------------
  2 | AB 1-2-3-4-5 |        0.8
  1 | ABC 1-2-3    |   0.714286
  4 | ABC 1-2      |   0.571429
  3 | ABC 1        |   0.428571
  5 | ABC          |   0.285714
(5 rows)
但是,您始终可以在
WHERE
子句中添加其他条件:

select *, similarity(value, 'ABC 1-2-3-4-5')
from test
where value ilike 'abc%'
order by 3 desc;

 id |   value   | similarity 
----+-----------+------------
  1 | ABC 1-2-3 |   0.714286
  4 | ABC 1-2   |   0.571429
  3 | ABC 1     |   0.428571
  5 | ABC       |   0.285714
(4 rows)    

颠倒对比:

select * from test
where 'ABC 1-2-3-4-5' ilike value || '%'
order by length(value) desc

最好的(即最长的)匹配将首先返回。

我对此投了更高的票,因为有一个实际的相似性度量,我可能会在将来使用它。
select * from test
where 'ABC 1-2-3-4-5' ilike value || '%'
order by length(value) desc