我有一个内容与此类似的表:
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
即,变化将是仅仅由几个字符或大小写不同的项目,只要它们被分组,哪些是剩下的并不重要。
答案 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)
在某个时候,您将不得不定义使一组值在一个组中属于一起的原因。如果这太难了,也许您应该禁止和禁止输入模糊数据,或者如果您必须允许它,请添加一个包含标题的已清理版本的列,以供分组操作使用。