Postgres中的模糊分组

时间:2009-10-30 17:28:14

标签: sql postgresql group-by fuzzy

我有一个内容与此类似的表:

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

即,变化将是仅仅由几个字符或大小写不同的项目,只要它们被分组,哪些是剩下的并不重要。

2 个答案:

答案 0 :(得分:3)

对于任何分组,您应该具有传递性相等性,即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)

答案 1 :(得分:2)

在某个时候,您将不得不定义使一组值在一个组中属于一起的原因。如果这太难了,也许您应该禁止和禁止输入模糊数据,或者如果您必须允许它,请添加一个包含标题的已清理版本的列,以供分组操作使用。