gpt4 book ai didi

sql - 如何在sql中查找几乎相似的记录?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:15:03 26 4
gpt4 key购买 nike

这是搜索记录:

A = {
field1: value1,
field2: value2,
...
fieldN: valueN
}

我在数据库中有很多这样的记录。

如果这些记录中的 N-M 个字段相等,其他记录 (B) 几乎与记录 A 匹配。这是示例,M=2:

B = {
field1: OTHER_value1,
field2: OTHER_value2,
field3: value3,
...
fieldN: valueN
}

If 可以是任何字段,不仅是第一个。

我可以进行非常大的组合 sql 查询,但可能有更漂亮的解决方案。

P.S.:我的数据库是 PostgreSQL。

最佳答案

这样的搜索条件将无法使用任何索引,但可以做到...

SELECT
*
FROM
yourTable
WHERE
N-M <= CASE WHEN yourTable.field1 = searchValue1 THEN 1 ELSE 0 END
+ CASE WHEN yourTable.field2 = searchValue2 THEN 1 ELSE 0 END
+ CASE WHEN yourTable.field3 = searchValue3 THEN 1 ELSE 0 END
...
+ CASE WHEN yourTable.fieldN = searchValueN THEN 1 ELSE 0 END

同样,如果您的搜索条件在另一个表中...

SELECT
*
FROM
yourTable
INNER JOIN
search
ON N-M <= CASE WHEN yourTable.field1 = search.field1 THEN 1 ELSE 0 END
+ CASE WHEN yourTable.field2 = search.field2 THEN 1 ELSE 0 END
+ CASE WHEN yourTable.field3 = search.field3 THEN 1 ELSE 0 END
...
+ CASE WHEN yourTable.fieldN = search.fieldN THEN 1 ELSE 0 END

(需要自己填充N-M的值)

编辑:

一种更冗长的方法,可以一些使用索引...

SELECT
id, -- your table would need to have a primary key / identity column
MAX(field1) AS field1,
MAX(field2) AS field2,
MAX(field3) AS field3,
...
MAX(fieldN) AS fieldN
FROM
(
SELECT * FROM yourTable WHERE field1 = searchValue1
UNION ALL
SELECT * FROM yourTable WHERE field2 = searchValue2
UNION ALL
SELECT * FROM yourTable WHERE field3 = searchValue3
...
SELECT * FROM yourTable WHERE fieldN = searchValueN
)
AS unioned_seeks
GROUP BY
id
HAVING
COUNT(*) >= N-M

如果您在每个字段上都有单独的索引,并且您预计每个字段的匹配数量相对较少,这可能优于第一个选项,但代价是非常重复的代码。

关于sql - 如何在sql中查找几乎相似的记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47877071/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com