0

我需要将用户输入与字符串列进行匹配。两者都包含空格分隔的单词。

订购标准是:

  1. 从开头匹配的单词数(前缀匹配)desc
  2. 匹配的字数desc
  3. 匹配单词与输入短语中的顺序相同的列排在第一位

所以给定以下示例数据

"one sample"
"un moment"
"no match"
"sample uno"
"uno sample"
"sample oun"

和样本输入"sa un foo",输出应该是:

  1. "sample uno"- 2 个前缀匹配
  2. "uno sample"- 相同但词序不同
  3. "sample oun"- 1 个前缀匹配 + 2 个单词匹配
  4. "un moment", "one sample"- 1 个前缀匹配

问题是:我可以在单个 SQL 查询 ( postgresql) 中实现它吗?我对 SQL 相当缺乏经验,所以我很感激任何帮助。谢谢!

我包含一个简单的SQL FIDDLE

4

1 回答 1

1
  • 首先分配和 id 到每一行
  • 将每个数据拆分为space
  • 拆分输入space
  • 交叉连接两个表并检查输入是否出现在数据上。
  • 最后加入原始表并计算有多少前缀和包含。

如果一个输入词作为前缀出现,而第二个词作为同一个词的包含出现,我认为可能需要特别注意

数据:格式
输入:FO AT

SQL 小提琴演示

WITH data as  (
    SELECT 
         row_number() OVER (ORDER BY field) AS id,
         field
    FROM 
      dtable
),
data_split as (
    SELECT
        id,
        unnest(string_to_array(field, ' ')) AS elem
    FROM data
),
input_split as (
    SELECT
        unnest(string_to_array(field, ' ')) AS elem
    FROM input
),
match as (
    SELECT *, strpos(d.elem, i.elem) as match_pos
    FROM   input_split i, data_split d
)
select 
    match.id, 
    data.field,
    SUM( CASE WHEN match_pos = 1 THEN 1 ELSE 0 END ) prefix,
    SUM( CASE WHEN match_pos > 1 THEN 1 ELSE 0 END ) contain
from  
    match inner join
    data on match.id = data.id
group by match.id, data.field
order by 3 desc, 4 desc

在此处输入图像描述

于 2015-07-30T21:06:08.547 回答