PostgreSQL удаляет повторяющиеся строки, игнорируя регистр - PullRequest
2 голосов
/ 08 октября 2011

Мне нужно удалить из таблицы строки с одинаковым значением в указанном поле, игнорируя регистр.Например, если у меня есть строка с значением 'foo' в качестве значения для поля и другая строка с значением 'Foo' в качестве значения для того же поля, я хочу удалить только одну из этих строк (оставив 1 строку).
Я пробовал что-то вроде этого:

delete from table t1 
where exists (select 1 
              from table t2 
              where t1.key <> t2.key 
                and t1.field ILIKE t2.field)

, но при этом удаляется и другая строка.
Есть ли предложения?

Ответы [ 2 ]

3 голосов
/ 08 октября 2011

Просто измените <> на <:

DELETE
  FROM table t1 
 WHERE exists (
    SELECT 1 
      FROM table t2 
     WHERE t1.key < t2.key 
       and t1.field ILIKE t2.field
 )

Таким образом, вы сохраните строки с самым высоким key.Вы также можете использовать >, чтобы вести записи с самым низким key.

1 голос
/ 08 октября 2011

Предполагая, key является первичным ключом таблицы:

DELETE FROM the_table t1
WHERE t1.key not in (select min(t2.key)
                     from the_table t2
                     group by lower(t2.field));
...