2

我有一个表格,其内容类似于:

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

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

4

2 回答 2

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)
于 2009-10-30T17:30:32.033 回答
2

有时,您将不得不定义是什么使一组值属于一个组。如果这太难了,也许您应该禁止和禁止输入模糊数据,或者如果您必须允许,请添加一个包含经过清理的标题版本的列,以供分组操作使用。

于 2009-10-30T17:32:38.770 回答