作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
这是搜索记录:
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/
我是一名优秀的程序员,十分优秀!