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 に答える