我有一个表格,其内容与此类似:
id | title
------------
1 | 5. foo
2 | 5.foo
3 | 5. foo*
4 | bar
5 | bar*
6 | baz
6 | BAZ
...等等。我想按标题分组并忽略多余的部分。我知道 Postgres 可以做到这一点:
SELECT * FROM (
SELECT regexp_replace(title, '[*.]+$', '') AS title
FROM table
) AS a
GROUP BY title
但是,这非常简单,如果我试图预测所有可能的变化,就会变得非常笨拙。那么,问题是,是否有比使用正则表达式更通用的模糊分组方法?这是否有可能,至少不会弄断背部?
编辑:澄清一下,对任何变体都没有偏好,这就是分组后表格的样子:
title
------
5. foo
bar
baz
即,变体是仅少数字符或大小写不同的项目,只要将它们分组,剩下哪些并不重要。
最佳答案
对于任何分组,您应该具有传递相等性,即a ~= b, b ~= c => a ~= c
。
严格使用文字来表述它,我们将尝试使用SQL
来表述它。
例如,foo*bar
应该去哪个组?
更新:
此查询将所有非字母数字字符替换为空格,并返回每个组中的第一个标题:
SELECT DISTINCT ON (REGEXP_REPLACE(UPPER(title), '[^[:alnum:]]', '', 'g')) title
FROM (
VALUES
(1, '5. foo'),
(2, '5.foo'),
(3, '5. foo*'),
(4, 'bar'),
(5, 'bar*'),
(6, 'baz'),
(7, 'BAZ')
) rows (id, title)
关于sql - Postgres 中的模糊分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1651229/